TreeTransform.h revision 3e518bda00d710754ca077cf9be8dd821e16a854
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" 17f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall#include "Lookup.h" 18dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h" 19c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h" 20657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h" 21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h" 22b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h" 2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h" 2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h" 2543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h" 26a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h" 27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h" 28b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h" 29b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h" 30a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h" 31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm> 32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang { 341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one 36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another. 37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide 401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template 41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the 42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the 43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar 44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and 45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters. 46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can 49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an 50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The 51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual. 52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which 54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node 55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions, 56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST 57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation 58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g., 59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes 60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create 61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node. 62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The 64670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(), 65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(), 66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely 67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations. 68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the 70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 7143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation 731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template 74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX 75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change. 76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild 77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may 78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps. 79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation 82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the 84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking 85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()). 86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform { 88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected: 89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &SemaRef; 901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningStmtResult OwningStmtResult; 93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningExprResult OwningExprResult; 94b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::StmtArg StmtArg; 95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::ExprArg ExprArg; 96b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::MultiExprArg MultiExprArg; 9743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor typedef Sema::MultiStmtArg MultiStmtArg; 9899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor typedef Sema::DeclPtrTy DeclPtrTy; 9999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Initializes a new tree transformer. 101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Derived &getDerived() { return static_cast<Derived&>(*this); } 105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Derived &getDerived() const { 1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return static_cast<const Derived&>(*this); 109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the semantic analysis object used for 112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this tree transform. 113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &getSema() const { return SemaRef; } 1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Whether the transformation should always rebuild AST nodes, even 116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// if none of the children have changed. 117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function to specify when the transformation 119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// should rebuild all AST nodes. 120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlwaysRebuild() { return false; } 1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the location of the entity being transformed, if that 123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, returns no source-location information. Subclasses can 126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// provide an alternative implementation that provides better location 127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information. 128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation getBaseLocation() { return SourceLocation(); } 1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the name of the entity being transformed, if that 131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns an empty name. Subclasses can provide an alternative 134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// implementation with a more precise name. 135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor DeclarationName getBaseEntity() { return DeclarationName(); } 136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Sets the "base" location and entity when that 138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// information is known based on another transformation. 139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, the source location and entity are ignored. Subclasses can 141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// override this function to provide a customized implementation. 142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor void setBase(SourceLocation Loc, DeclarationName Entity) { } 1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief RAII object that temporarily sets the base location and entity 145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// used for reporting diagnostics in types. 146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor class TemporaryBase { 147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TreeTransform &Self; 148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OldLocation; 149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OldEntity; 1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor public: 152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase(TreeTransform &Self, SourceLocation Location, 1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Entity) : Self(Self) { 154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldLocation = Self.getDerived().getBaseLocation(); 155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldEntity = Self.getDerived().getBaseEntity(); 156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(Location, Entity); 157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ~TemporaryBase() { 160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(OldLocation, OldEntity); 161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor }; 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determine whether the given type \p T has already been 165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformed. 166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses can provide an alternative implementation of this routine 1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// to short-circuit evaluation when it is known that a given type will 169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not change. For example, template instantiation need not traverse 170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// non-dependent types. 171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlreadyTransformed(QualType T) { 172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.isNull(); 173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transforms the given type into another type. 176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by creating a 178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// DeclaratorInfo for it and delegating to the appropriate 179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// function. This is expensive, but we don't mind, because 180a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// this method is deprecated anyway; all users should be 181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// switched to storing DeclaratorInfos. 182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \returns the transformed type. 184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType TransformType(QualType T); 1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transforms the given type-with-location into a new 187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type-with-location. 188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// 189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by delegating to the 190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// appropriate TransformXXXType to build a new type. Subclasses 191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// may override this function (to take over all type 192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// transformations) or some set of the TransformXXXType functions 193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// to alter the transformation. 194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *TransformType(DeclaratorInfo *DI); 195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transform the given type-with-location into a new 197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type, collecting location information in the given builder 198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// as necessary. 199577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 202657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this routine transforms a statement by delegating to the 20543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// appropriate TransformXXXStmt function to transform a specific kind of 20643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// statement or the TransformExpr() function to transform an expression. 20743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to transform statements using some 20843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// other mechanism. 20943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 21043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \returns the transformed statement. 211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformStmt(Stmt *S); 2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 213657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 214657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E) { 222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false); 223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Transform the given expression. 226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand); 2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 239dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 240dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Decl *TransformDecl(Decl *D) { return D; } 24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 24243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Transform the definition of the given declaration. 24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, invokes TransformDecl() to transform the declaration. 24543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 24643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); } 2471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// \brief Transform the given declaration, which was the first part of a 2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// nested-name-specifier in a member access expression. 2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// This specific declaration transformation only applies to the first 2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// identifier in a nested-name-specifier of a member access expression, e.g., 2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// the \c T in \c x->T::member 2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// By default, invokes TransformDecl() to transform the declaration. 2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// Subclasses may override this function to provide alternate behavior. 2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor return cast_or_null<NamedDecl>(getDerived().TransformDecl(D)); 2596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor } 2606cd219879ffce00920189ec1dcea927a42602961Douglas Gregor 261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, transforms all of the types and declarations within the 264dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 265dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 267a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 268c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType = QualType(), 269c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 27681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 27781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName TransformDeclarationName(DeclarationName Name, 278dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 279dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType = QualType()); 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and nested-name-specifiers that occur within the template name. 285d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 2863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName TransformTemplateName(TemplateName Name, 2873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType = QualType()); 2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this operation transforms the type, expression, or 2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// declaration stored within the template argument and constructs a 293670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 294670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// 296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// Returns true if there was an error. 297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output); 299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall void InventTemplateArgumentLoc(const TemplateArgument &Arg, 302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &ArgLoc); 303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a DeclaratorInfo for a type. 305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DeclaratorInfo *InventDeclaratorInfo(QualType T) { 306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.Context.getTrivialDeclaratorInfo(T, 307833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().getBaseLocation()); 308833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 31585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 31685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 317dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType 318dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TransformTemplateSpecializationType(const TemplateSpecializationType *T, 319dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType); 320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType 322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransformTemplateSpecializationType(TypeLocBuilder &TLB, 323833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 324833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType); 325dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 32643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 32943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 331c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor OwningExprResult Transform##Node(Node *E, bool isAddressOfOperand); 332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 3341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 33985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 34585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 34785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \brief Build a new reference type given the type it references. 348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 34985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// By default, performs semantic analysis when building the 35085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// reference type. Subclasses may override this routine to provide 35185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// different behavior. 352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \param LValue whether the type was written with an lvalue sigil 35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// or an rvalue sigil. 35585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildReferenceType(QualType ReferentType, 35685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool LValue, 35785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new Objective C object pointer type. 36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildObjCObjectPointerType(QualType PointeeType, 36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 3841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 39385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 39485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 40385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 40485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVectorType(QualType ElementType, unsigned NumElements); 4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4787da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4797da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4807da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 4817da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 4827da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateLoc, 508d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args); 5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 5171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 5221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 5261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getTypenameType(NNS, 527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 5351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildTypenameType(NestedNameSpecifier *NNS, 538833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const IdentifierInfo *Id, 539833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR) { 540833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.CheckTypenameType(NNS, *Id, SR); 541dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 5421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 543dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 549dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 550dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 551a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 552c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 553c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 554dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 556dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 557dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 558dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 559dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 562dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 574dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 575d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 576d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 578d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 579d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 580d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 581d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 582d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 583d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 584d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 586d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 587d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 588d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 589d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 590d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 591d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 592d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 593d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 5943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 5953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 597ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// \brief Build a new template name given a nested name specifier and the 598ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// overloaded operator name that is referred to as a template. 599ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// 600ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// By default, performs semantic analysis to determine whether the name can 601ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 602ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// template name. Subclasses may override this routine to provide different 603ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// behavior. 604ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 605ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 606ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType); 607ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 60843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 66999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, StmtArg Then, 67099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor SourceLocation ElseLoc, StmtArg Else) { 67199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar), 67299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), ElseLoc, move(Else)); 67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 67999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(Sema::FullExprArg Cond, 68099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar) { 68199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnStartOfSwitchStmt(Cond, DeclPtrTy::make(CondVar)); 68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 70099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 70299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, DeclPtrTy::make(CondVar), 70399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 7151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 72599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor StmtArg Init, Sema::FullExprArg Cond, 72699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, Sema::FullExprArg Inc, 72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 72899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond, 72999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor DeclPtrTy::make(CondVar), 73099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Inc, RParenLoc, move(Body)); 73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 7591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 7681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclaratorInfo *Declarator, 78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 80043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 80343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 816f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 817f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 818f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL) { 819f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 820f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 821f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 822f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 823f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// \brief Build a new expression that references a declaration. 824f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// 825f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// By default, performs semantic analysis to build the new expression. 826f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Subclasses may override this routine to provide different behavior. 827a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier, 828a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 829c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor NamedDecl *ND, SourceLocation Loc, 830c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 831a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 832a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setScopeRep(Qualifier); 833a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setRange(QualifierRange); 834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildDeclarationNameExpr(Loc, ND, 835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false, 836a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor &SS, 837c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 849a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 852a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 853a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation DestroyedTypeLoc, 857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType, 858a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier, 859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceRange QualifierRange) { 860a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXScopeSpec SS; 861a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Qualifier) { 862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setRange(QualifierRange); 863a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setScopeRep(Qualifier); 864a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 865a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 8661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 867a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 868a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType)); 8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 871a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OperatorLoc, 872a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor isArrow? tok::arrow : tok::period, 873a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedTypeLoc, 874a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Name, 875a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Sema::DeclPtrTy::make((Decl *)0), 876a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor &SS); 8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 8866ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr)); 887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 8935ab75172051a6d2ea71a80a79e81c65519fd3462John McCall OwningExprResult RebuildSizeOfAlignOf(DeclaratorInfo *DInfo, 8945ab75172051a6d2ea71a80a79e81c65519fd3462John McCall SourceLocation OpLoc, 895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 8965ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getSema().CreateSizeOfAlignOfExpr(DInfo, OpLoc, isSizeOf, R); 897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 8991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 9171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 9251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 9421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 9461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 94783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 94883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 94983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 9508a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor NamedDecl *Member, 951d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *ExplicitTemplateArgs, 9528a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor NamedDecl *FirstQualifierInScope) { 953d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 954d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 955d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 9561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 958d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow, 959d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 960d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 961d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 962d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 96483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 96583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 96683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 96783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 96883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 96983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 970017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isArrow? tok::arrow : tok::period, 972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 973017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Member->getDeclName(), 9748a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor ExplicitTemplateArgs, 97583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 9768a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor &SS, 9778a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor FirstQualifierInScope); 978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 9876ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, 9886ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor LHS.takeAs<Expr>(), RHS.takeAs<Expr>()); 989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 9921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 10001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new implicit cast expression. 10051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new implicit cast without any semantic analysis. 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, bool isLvalue) { 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitCastExpr *ICE 10111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (getSema().Context) ImplicitCastExpr(T, Kind, 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)SubExpr.release(), 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isLvalue); 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned(ICE); 1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 10181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy, 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy.getAsOpaquePtr(), 1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 10331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 10451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 10522d1c21414199a7452f122598189363a3922605b1Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::period, AccessorLoc, 10542d1c21414199a7452f122598189363a3922605b1Douglas Gregor DeclarationName(&Accessor), 1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1064e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor SourceLocation RBraceLoc, 1065e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor QualType ResultTy) { 1066e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor OwningExprResult Result 1067e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1068e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor if (Result.isInvalid() || ResultTy->isDependentType()) 1069e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1070e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor 1071e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // Patch in the result type we were given, which may have been computed 1072e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // when the initial InitListExpr was built. 1073e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1074e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor ILE->setType(ResultTy); 1075e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 11121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 11171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1123f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc, 1124f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian move(SubExprs)); 1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 11281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 11291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 11861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 11911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 12031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 12041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 12081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 12091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 12131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 12151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 12191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 12431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 12591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 12911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 130488650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 130888650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 13411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 13461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ThisType) { 1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1368f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 13811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 13941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 14371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 14411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1446865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS, 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1450f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall const TemplateArgumentListInfo *TemplateArgs) { 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1454f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1455f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (TemplateArgs) 1456f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location, 1457f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall *TemplateArgs); 1458f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1459f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location); 1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1466f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 1467f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 1468f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL, 1469d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 1470f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs); 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 1481ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ 1482ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson SourceLocation(), 1483ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson T, Constructor, IsElidable, 1484f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson move(Args)); 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1528865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE, 1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1531a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1532a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1534c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1535c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 15360dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult Base = move(BaseE); 1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1538a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1540a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1541a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, 1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Base), OperatorLoc, OpKind, 1545017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor MemberLoc, 1546017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Name, 1547a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 1548c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor &SS, 1549c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 15523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Build a new member reference expression with explicit template 15533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// arguments. 15543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1557865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE, 15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow, 15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NestedNameSpecifier *Qualifier, 15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceRange QualifierRange, 15623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName Template, 15633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation TemplateNameLoc, 15643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierInScope, 1565d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult Base = move(BaseE); 15673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: We're going to end up looking up the template based on its name, 15742d1c21414199a7452f122598189363a3922605b1Douglas Gregor // twice! Also, duplicates part of Sema::BuildMemberAccessExpr. 15753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor DeclarationName Name; 15763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) 15773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = ActualTemplate->getDeclName(); 15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (OverloadedFunctionDecl *Ovl 15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = Template.getAsOverloadedFunctionDecl()) 15803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Ovl->getDeclName(); 1581ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else { 1582ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateName *DTN = Template.getAsDependentTemplateName(); 1583ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1584ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name = DTN->getIdentifier(); 1585ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else 1586ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name = SemaRef.Context.DeclarationNames.getCXXOperatorName( 1587ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DTN->getOperator()); 1588ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } 1589d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 1590d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall OperatorLoc, OpKind, 1591d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateNameLoc, Name, 1592d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall &TemplateArgs, 1593d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall Sema::DeclPtrTy(), &SS); 15943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 15951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 16211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 16321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 16420da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor BuiltinLoc); 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 16441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 166443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 166543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 166643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 166743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 167043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 167443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 167543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 167943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 168043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 168143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 168243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 168343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 168543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1687afe7ec28b1880335daba5f7310fe5191e14c4e76Douglas Gregor return getSema().ActOnExprStmt(getSema().FullExpr(E)); 168843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 16891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 169143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 169243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 16931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1695670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isAddressOfOperand) { 1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1705c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E), \ 1706c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 17081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1711657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1712657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1713657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1716a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1717c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1718c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 17190979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 17200979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 17211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 172243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1723dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 17251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1726c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1727c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 17301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1732c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1733a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1734c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1737dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 17391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1740a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1741a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1742a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1746a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1747c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1748c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 17541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1763dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1765dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1767dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1769fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 1770dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1771d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1772d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1774dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1776dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1781dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1782dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1783dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1785dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 17861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1787dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1788dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1789dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 17901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1792dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 1793dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 179481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 179581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 179681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 179781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 179881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 179981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 180081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 180181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 180281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 18033e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 180481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 180581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 180781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 180881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 180981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 1811dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType T; 1812dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor if (!ObjectType.isNull() && 1813dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor isa<TemplateSpecializationType>(Name.getCXXNameType())) { 1814dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TemplateSpecializationType *SpecType 1815dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = cast<TemplateSpecializationType>(Name.getCXXNameType()); 1816dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = TransformTemplateSpecializationType(SpecType, ObjectType); 1817dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor } else 1818dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = getDerived().TransformType(Name.getCXXNameType()); 181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 182081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 18211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 182281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 18231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 182481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 182581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 18271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 182881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 182981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 183081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 183181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 18321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 18333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 18343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1835d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 18361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1837d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1850d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1857f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they make it into the AST. 1858f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded template name survived to here"); 1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1863d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1869dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 1870dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1873ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1874ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(), 1875ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1876ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 1877ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, DTN->getOperator(), 1878ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1879d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 18821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1883d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1884d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1885d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1887d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1888d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1889d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1891d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1892d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1894f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they reach the AST. 1895f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded function decl survived to here"); 1896f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return TemplateName(); 1897d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1898d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1899d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1900833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 1901833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 1902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 1904670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1905670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 1906833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::llvm_unreachable("null template argument in TreeTransform"); 1907833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1909833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 1910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 1911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc)); 1912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1915788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 1916788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(Arg, SourceRange(), Loc); 1917788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor break; 1918788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 1924670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 1926828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 1927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1928833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 1929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1935833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 1936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 19411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1942670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DeclaratorInfo *DI = Input.getSourceDeclaratorInfo(); 1944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = InventDeclaratorInfo(Input.getArgument().getAsType()); 1946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 1948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 1949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1952670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1954670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 1956972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 1957972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 1958972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 1959788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), Name); 1960670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 1962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1963828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 1964828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 1965828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 1966828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Action::Unevaluated); 1967828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr); 1968828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (E.isInvalid()) 1969828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = NULL; 1970828bff2079b6a91ecd7ed5b842c59527d7682789John McCall else { 1971828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = E.takeAs<Expr>(); 1972828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr->Retain(); 1973828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1974828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1975828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 1976828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 1977833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1978670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1980788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: { 1981788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName()); 1982788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateName Template 1983788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor = getDerived().TransformTemplateName(Arg.getAsTemplate()); 1984788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor if (Template.isNull()) 1985788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return true; 1986788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1987788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(TemplateArgument(Template), 1988788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateQualifierRange(), 1989788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateNameLoc()); 1990788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return false; 1991788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor } 1992788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1993670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 1994670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 19951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 1996670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 19971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1998833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 1999833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 2000833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2001833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Sema::OwningExprResult E 2002833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 2003833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 2004833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2005833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *ETaken = E.takeAs<Expr>(); 2006828bff2079b6a91ecd7ed5b842c59527d7682789John McCall ETaken->Retain(); 2007833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken); 2008833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2009670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2011670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 2012670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 2013670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 20141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 2015670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 2016670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 20171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2018833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2019833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2020833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2021828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2022828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2023828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2024828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2025833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2026833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2027828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2028670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2029670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 20301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 2031670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 2032828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Result, Input.getLocInfo()); 2033833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2034670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2035670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2037670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2038833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2039670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2040670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2041577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2045577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 2047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T); 20534802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 2054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(DI); 20561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallDeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) { 2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 2066a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 20671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 20691bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 20721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, TL); 2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 20761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TLB.getDeclaratorInfo(SemaRef.Context, Result); 2078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 2083a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 2084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2090577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::llvm_unreachable("unhandled type loc!"); 2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 2098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 2103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedTypeLoc T) { 2104a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers Quals = T.getType().getLocalQualifiers(); 2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 21151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make 2133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work. 2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \ 2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 214385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType, \ 214485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); \ 2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \ 2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setSigilLoc(TL.getSigilLoc()); \ 2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0) 2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BuiltinTypeLoc T) { 2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB, 2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FixedWidthIntTypeLoc T) { 2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ComplexTypeLoc T) { 2171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2172a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointerTypeLoc TL) { 2178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(PointerType); 2179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BlockPointerTypeLoc TL) { 2185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(BlockPointerType); 2186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 218885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 218985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 219085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 219185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 219285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 219385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 219485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 219585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc TL) { 219685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 219785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 219885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 219985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 220085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 220485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 220585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 220685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 220785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 220985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 221085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 221285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 221385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 221485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 221585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 221685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 221785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 221985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 222085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 222185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 222285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 222385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 2224a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2225a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2226a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2227a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall LValueReferenceTypeLoc TL) { 222885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2229a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2231a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2232a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2233a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RValueReferenceTypeLoc TL) { 223585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2241a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc TL) { 2242a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2243a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2248a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 225885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 225985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 2260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 22701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc TL) { 2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 228585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 228685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 22941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc TL) { 2309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 231985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 232085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc TL) { 2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2342670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2343670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2344670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 236085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 23701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayTypeLoc TL) { 2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2383670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2384670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 23851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 240185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 24061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc TL) { 2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2428670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2429670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2430670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2437eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2438eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc TL) { 2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 24781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc TL) { 2485a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2495a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2496a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 25021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 25061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2508a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc TL) { 2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Transform the parameters. 2516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo(); 2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall assert(OldDI->getType() == T->getArgType(i)); 2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(OldDI); 2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewDI == OldDI) 2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = OldParm; 2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else 2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = ParmVarDecl::Create(SemaRef.Context, 2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getDeclContext(), 2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getLocation(), 2538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getIdentifier(), 2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI->getType(), 2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI, 2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getStorageClass(), 2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* DefArg */ NULL); 2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.push_back(NewType); 2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamDecls.push_back(NewParm); 2558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 25591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc TL) { 2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2590a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc TL) { 2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc TL) { 2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprType *T = TL.getTypePtr(); 2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2631670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2632670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 26461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc TL) { 2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfType *T = TL.getTypePtr(); 2657a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: should be an inner type, or at least have a DeclaratorInfo. 2659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Underlying.isNull()) 2661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2665a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfType(Underlying); 2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 26701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc TL) { 2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2682670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2683670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2687577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 2706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc TL) { 2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 2708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2715a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 2716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 27201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2725577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc TL) { 2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 2731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2733577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2748577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27497da2431c23ef1ee8acb114e39692246e1801afc2John McCall 27507da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 2752a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc TL) { 2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 27567da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 27577da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 27587da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 27591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2762a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 27727da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 27731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2775577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2776577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateTypeParmTypeLoc TL) { 2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 2780577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2781577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 27821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 278349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall SubstTemplateTypeParmTypeLoc TL) { 2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 278749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 278849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 278949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2790dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType 2791dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType( 2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateSpecializationTypeLoc TL) { 2794833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(TLB, TL, QualType()); 2795833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2796a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2797833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2798833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2799833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *TST, 2800833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2801833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: this entire method is a temporary workaround; callers 2802833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // should be rewritten to provide real type locs. 2803a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2804833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Fake up a TemplateSpecializationTypeLoc. 2805833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder TLB; 2806833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL 2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0)); 2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2809828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceLocation BaseLoc = getDerived().getBaseLocation(); 2810828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2811828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setTemplateNameLoc(BaseLoc); 2812828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setLAngleLoc(BaseLoc); 2813828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setRAngleLoc(BaseLoc); 2814833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2815833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &TA = TST->getArg(i); 2816833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc TAL; 2817833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().InventTemplateArgumentLoc(TA, TAL); 2818833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.setArgLocInfo(i, TAL.getLocInfo()); 2819833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder IgnoredTLB; 2822833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType); 2823dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 2824dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 2825dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 2826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2827833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 2828833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 2829833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2830833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 2831833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 28321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2833dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2834577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2835577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2837d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo NewTemplateArgs; 2838d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 2839d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 2840d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 2841d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) { 2842d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 2843d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc)) 2844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2845d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.addArgument(Loc); 2846d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 28471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2848833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 2849833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2850833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 2851833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 2852833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 2853d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs); 28541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2855833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 2856833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 2857833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 2858833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 2859833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 2860833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 2861833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 2862833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 2863833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 28641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2865833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 2866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2869a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2870a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 2871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc TL) { 2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 2873577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2874577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2875577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2881577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2883a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2884a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2885a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 2886a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2896577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB, 2900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc TL) { 2901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameType *T = TL.getTypePtr(); 2902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /* FIXME: preserve source information better than this */ 2904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR(TL.getNameLoc()); 2905833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2907833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR); 2908577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2911a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 29141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 2915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2917577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2920577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 29231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2924a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, NewTemplateId); 2925a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR); 2927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2929a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2930a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result); 2932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2939a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCInterfaceTypeLoc TL) { 294154e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCInterfaceType unimplemented"); 294254e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 2943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 2948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCObjectPointerTypeLoc TL) { 294954e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCObjectPointerType unimplemented"); 295054e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 295124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 295224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 295443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 295543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 295643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 295743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 29591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 296143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 296243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 296343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 296443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 296543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 297443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 29791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 29831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 29861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 298943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 299243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 29931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 2997264c1f8ec895952466eab59b84b8b06801e721faEli Friedman OwningExprResult LHS(SemaRef), RHS(SemaRef); 2998264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 2999264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 3000264c1f8ec895952466eab59b84b8b06801e721faEli Friedman EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 30011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3002264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 3003264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 3004264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 3005264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 30061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3007264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 3008264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 3009264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 3010264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 3011264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 30121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 301443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 301543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 302043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 303043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 303143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 303843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 304343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 305143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 305443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 30601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 30611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 30638cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor OwningExprResult Cond(SemaRef); 30648cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 30658cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 30668cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor ConditionVar 30678cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 30688cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 30698cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 30708cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor return SemaRef.StmtError(); 307199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 30728cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 30738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 307499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 307599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 307699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 30778cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 30791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 308143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 309299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 30951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 30961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 309899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), 30991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 310043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 310143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 310243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 310343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 3106d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor OwningExprResult Cond(SemaRef); 3107d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor VarDecl *ConditionVar = 0; 3108d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (S->getConditionVariable()) { 3109d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor ConditionVar 3110d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor = cast_or_null<VarDecl>( 3111d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 3112d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (!ConditionVar) 3113d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor return SemaRef.StmtError(); 311499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 3115d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 311699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 311799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 311899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 311999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 31201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 312299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 312499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond, 312599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar); 312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 312743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 313143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 314243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 31435656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor OwningExprResult Cond(SemaRef); 31445656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor VarDecl *ConditionVar = 0; 31455656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (S->getConditionVariable()) { 31465656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor ConditionVar 31475656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor = cast_or_null<VarDecl>( 31485656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 31495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (!ConditionVar) 31505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor return SemaRef.StmtError(); 315199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 31525656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 315399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 315499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 315599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 315699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 31571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 316243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 316799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar, 317299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 317343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 317743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 317843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 318043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 320343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 320799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningExprResult Cond(SemaRef); 320899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *ConditionVar = 0; 320999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (S->getConditionVariable()) { 321099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar 321199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor = cast_or_null<VarDecl>( 321299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 321399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (!ConditionVar) 321499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 321599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 321699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 321799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 321899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 321999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 322099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 32211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 322343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 322443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 322543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 323443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 32371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 324099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Init), getSema().FullExpr(Cond), 324199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar, 324299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor getSema().FullExpr(Inc), 324343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 324443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 32471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 32481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 32501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 325143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 325343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 325443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 325943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 326143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 326243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 32631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 326643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 326743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 32721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 32781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 328643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 329143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 329443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 330043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 33061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 33111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 331543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 331843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 332243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 332343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 332443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 332543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 332643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 332743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 33291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 33381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 334643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 33541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 335743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 336043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 33621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 33681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 337043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 337443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 33771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 33801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclaratorInfo(), 340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 340243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 340343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 340643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 341043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 341443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 341743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 342243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 34341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 344143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 34431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 344443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 344643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 344943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 34551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 346143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 3463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 34641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3466c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E, 3467c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3473c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E, 3474c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3475a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3476a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 3477a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3478a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor E->getQualifierRange()); 3479a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 3480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3481a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3482a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 34831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *ND 3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3488a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 3489a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 3490a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 3491a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor !E->hasExplicitTemplateArgumentList()) 34921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3494a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: We're losing the explicit template arguments in this transformation. 3495a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3496833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs()); 3497a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3498833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], 3499833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransArgs[I])) 3500a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3501a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3502a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3503a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: Pass the qualifier/qualifier range along. 3504a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 3505c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ND, E->getLocation(), 3506c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 3507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3511c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E, 3512c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3518c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E, 3519c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3525c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E, 3526c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3532c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E, 3533c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3539c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E, 3540c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3546c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformParenExpr(ParenExpr *E, 3547c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 35591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3561c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E, 3562c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3563c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr(), 3564c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor E->getOpcode() == UnaryOperator::AddrOf); 3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3578c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E, 3579c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 35815ab75172051a6d2ea71a80a79e81c65519fd3462John McCall DeclaratorInfo *OldT = E->getArgumentTypeInfo(); 35825557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 35835ab75172051a6d2ea71a80a79e81c65519fd3462John McCall DeclaratorInfo *NewT = getDerived().TransformType(OldT); 35845ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35875ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35905ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 35961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 36011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3617c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E, 3618c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3641c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E, 3642c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 36601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 36711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3681c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E, 3682c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 368783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 368883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 36891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 369083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 369183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange()); 3692c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 369383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 369483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 36951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *Member 3697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 370383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 37048a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member == E->getMemberDecl() && 37058a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor !E->hasExplicitTemplateArgumentList()) 37061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3708d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 37098a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor if (E->hasExplicitTemplateArgumentList()) { 3710d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 3711d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 37128a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3713d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 3714d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 37158a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor return SemaRef.ExprError(); 3716d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 37178a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 37188a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 37198a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor 3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 372683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 372783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 37298a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 3730d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall (E->hasExplicitTemplateArgumentList() 3731d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 37328a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor 0); 3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3737c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCastExpr(CastExpr *E, 3738c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 37401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3745c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E, 3746c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 37581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 37641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3767c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CompoundAssignOperator *E, 3768c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3769c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformBinaryOperator(E, isAddressOfOperand); 3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3774c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E, 3775c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 379547e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 37961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 379747e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 38021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3803c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E, 3804c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 38055557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 38065557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 38075557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have type information here? It seems like we won't, 38085557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // so do we even need to transform the type? 3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 38201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 38231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isLvalueCast()); 3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3829c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E, 3830c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 38321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3837c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E, 3838c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 38451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getTypeAsWritten()); 3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 38581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3867c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E, 3868c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeTypeLoc 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 38751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 38881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3897c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E, 3898c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 39051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3917c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E, 3918c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 39201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 39321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3935e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3940c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E, 3941c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 39431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 394443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 394943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 39691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 39921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 4010c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ImplicitValueInitExpr *E, 4011c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 40125557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 40135557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 40145557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 40155557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 40221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4029c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E, 4030c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 40331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4057c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E, 4058c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4082c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E, 4083c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4089c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult 4090c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E, 4091c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 40921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 41001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4108c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E, 4109c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 41141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 4131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4135c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E, 4136c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 41531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4162c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E, 4163c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 41641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4169c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E, 4170c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4175c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor OwningExprResult First 4176c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor = getDerived().TransformExpr(E->getArg(0), 4177c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor E->getNumArgs() == 1 && E->getOperator() == OO_Amp); 4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 41911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 41921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 41961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4203c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E, 4204c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4205c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCallExpr(E, isAddressOfOperand); 4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4210c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E, 4211c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 42151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 42181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 42411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4252c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E, 4253c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4254c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4259c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E, 4260c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4261c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 4267c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXReinterpretCastExpr *E, 4268c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4269c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4274c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E, 4275c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4276c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 4282c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXFunctionalCastExpr *E, 4283c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 42871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4313c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E, 4314c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 43171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 43351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 43441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 43531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4354c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E, 4355c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 43561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 4362c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXNullPtrLiteralExpr *E, 4363c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 43641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4369c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E, 4370c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 43721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4386c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E, 4387c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 43941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4401c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E, 4402c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 44031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(Param); 4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4417c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E, 4418c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 44271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4437c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E, 4438c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 446243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 44771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4496c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E, 4497c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 4500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 45031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Operand.get() == E->getArgument()) 45041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4514a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 4515c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXPseudoDestructorExpr *E, 4516c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4517a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4518a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 4519a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 45201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4521a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 4522a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4523a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4524a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 4525a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 45261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4527a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 4528a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 4529a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 4530a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 4531a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 4532a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 4533a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 45341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4535a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 4536a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 4537a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 4538a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 4539a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 45401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4541a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 4542a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 4543a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 4544a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 4545a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 4546a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 4547a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4548a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 45491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4550a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 4551a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 4552ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 4553f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UnresolvedLookupExpr *Old, 4554c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4555f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName()); 4556f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4557f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 4558f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Sema::LookupOrdinaryName); 4559f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4560f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Transform all the decls. 4561f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 4562f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = Old->decls_end(); I != E; ++I) { 4563f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I)); 4564f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!InstD) 4565f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4566f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4567f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Expand using declarations. 4568f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (isa<UsingDecl>(InstD)) { 4569f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 4570f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 4571f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = UD->shadow_end(); I != E; ++I) 4572f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(*I); 4573f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall continue; 4574f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4575f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4576f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(InstD); 4577f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4578f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4579f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Resolve a kind, but don't do any further analysis. If it's 4580f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // ambiguous, the callee needs to deal with it. 4581f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.resolveKind(); 4582f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4583f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Rebuild the nested-name qualifier, if present. 4584f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 4585f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NestedNameSpecifier *Qualifier = 0; 4586f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Old->getQualifier()) { 4587f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 4588f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Old->getQualifierRange()); 4589f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Qualifier) 4590f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4591f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4592f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setScopeRep(Qualifier); 4593f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setRange(Old->getQualifierRange()); 4594f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4595f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4596f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have no template arguments, it's a normal declaration name. 4597f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Old->hasExplicitTemplateArgs()) 4598f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 4599f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4600f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have template arguments, rebuild them, then rebuild the 4601f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // templateid expression. 4602f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 4603f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 4604f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentLoc Loc; 4605f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc)) 4606f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4607f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs.addArgument(Loc); 4608f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4609f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4610f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(), 4611f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs); 4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4616c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E, 4617c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 46191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 46311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 4634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4641865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 4642865d447ac6a4721ab58e898d014a21f2eff74b06John McCall DependentScopeDeclRefExpr *E, 4643c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4645f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4646f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 465181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 465281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 465381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 46541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!E->hasExplicitTemplateArgs()) { 4656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!getDerived().AlwaysRebuild() && 4657f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NNS == E->getQualifier() && 4658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name == E->getDeclName()) 4659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.Owned(E->Retain()); 46601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 4663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 4664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /*TemplateArgs*/ 0); 4665f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 4666d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 4667d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 4668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4669d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4670d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4672d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4675f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4676f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 4677f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 4678f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall &TransArgs); 4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4683c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E, 4684c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 46991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 47151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 47221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to 47231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the 4724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself 4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique. 4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4728c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E, 4729c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 47401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new 47411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the 4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the 4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression. 4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 4747c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXExprWithTemporaries *E, 4748c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned( 4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->shouldDestroyTemporaries())); 4756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 4761c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXTemporaryObjectExpr *E, 4762c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 47871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 47931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 47981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 4812c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXUnresolvedConstructExpr *E, 4813c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 48381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4851865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 4852865d447ac6a4721ab58e898d014a21f2eff74b06John McCall CXXDependentScopeMemberExpr *E, 4853c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Start the member reference and compute the object's type. 4860a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Sema::TypeTy *ObjectType = 0; 48611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4862a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getOperatorLoc(), 4863a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4864a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType); 4865a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (Base.isInvalid()) 4866a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 48671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48686cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 48696cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 4870c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 48716cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 48726cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 48736cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 48741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4875a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4876a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4877a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4878a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4879c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType::getFromOpaquePtr(ObjectType), 4880c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 4881a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4882a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4883a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 48841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 4886dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 4887dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 488881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 488981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 48901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!E->hasExplicitTemplateArgumentList()) { 48923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 48933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 48943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 48953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Base.get() == E->getBase() && 48963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 48973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 48983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 48991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 49001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4901865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 49023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 49033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 49043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 49053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 49063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 49073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 49083b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope); 49093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 49103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 49113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This is an ugly hack, which forces the same template name to 49123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // be looked up multiple times. Yuck! 4913ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemporaryBase Rebase(*this, E->getMemberLoc(), DeclarationName()); 4914ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName OrigTemplateName; 4915ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) 4916ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OrigTemplateName = SemaRef.Context.getDependentTemplateName(0, II); 4917ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else 4918ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OrigTemplateName 4919ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor = SemaRef.Context.getDependentTemplateName(0, 4920ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.getCXXOverloadedOperator()); 49211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 49231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getDerived().TransformTemplateName(OrigTemplateName, 49243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 49253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (Template.isNull()) 49263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 49271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4928d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 49293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4930d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4931d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 49323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 4933d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 49343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 49351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4936865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4939a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4940a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 49413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Template, 4942c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor E->getMemberLoc(), 49433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 4944d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs); 4945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4949c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E, 4950c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 49511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4956c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E, 4957c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 4959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 4960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 4961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 4962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 49661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 4969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 4970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4975c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E, 4976c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4984c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E, 4985c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 49861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4991c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E, 4992c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 49931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 4996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 4997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 50011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 50021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 5006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 50081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5013c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E, 5014c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 50171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5022c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E, 5023c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 50261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 503109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 5032c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ObjCImplicitSetterGetterRefExpr *E, 5033c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 50361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5041c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E, 5042c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 50451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5050c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E, 5051c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 50541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5059c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E, 5060c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 5065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 50711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 50741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 50751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5083c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E, 5084c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 50871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5092c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E, 5093c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 50961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 510485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 510585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 510685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star, 5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 511185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 511285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 511385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star, 5114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 511985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 512085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 512185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 512285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(), 512385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 512885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 512985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 513085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 51310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 513285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 513785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType, 513885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 513985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil, 5140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseEntity()); 5141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 5145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 5146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 5148577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 5149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 5151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 5152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 5153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 5154577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 51551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 51571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 51591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 5160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 5161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 5162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 5163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 5164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 5165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 5166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 5167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 51681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeType.isNull()) 5170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 51711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 51731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 5174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 51751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 5176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 5181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 518385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 518485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 51851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 518685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 5192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 519385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 519485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 51951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 519685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5199577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 52001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 52011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 5202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5204577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5205577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 52061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5207577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5208577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 52121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 52131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 5214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 52181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5223577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 5225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 5226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 5227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 5228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5230577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 5232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 5233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 5235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 5236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 52371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 5238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 5240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 52441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 52451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 5246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 5249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 52531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 5254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 52551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 5256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 52571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 5258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 5259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 5260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 5261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 5265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 5266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5268a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 5270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 5271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 5275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 5276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 5280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 5281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 5285833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 5286833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 5287d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 5288d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 5289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5291dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5292dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5293dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5294dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5295a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 5296c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 5297d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NamedDecl *FirstQualifierInScope) { 5298dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 5299dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 5300dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 5301dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 5302dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 53031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 5304495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 5305c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 5306c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 5307495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor false)); 5308dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5309dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5310dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5311dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5312dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5313dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5314dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 5315dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 5316dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5317dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5318dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5319dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5320dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5321dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5322dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 5323dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 5324dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 5325dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 5326a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here"); 5327dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 5328dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 5329dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 53301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5331dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 5332dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 5333dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 53341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5335d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 53361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5337d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5338d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5339d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 53401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 5341d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 5342d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5343d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5344d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 53451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5346d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 53473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 53483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 5349d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 5350d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 53511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 5352014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor UnqualifiedId Name; 5353014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation()); 53543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 53553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 53563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 5357014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name, 5358a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5359a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 53603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 5361d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 53621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5364ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5365ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5366ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 5367ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 5368ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor CXXScopeSpec SS; 5369ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 5370ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setScopeRep(Qualifier); 5371ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 5372ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SourceLocation SymbolLocations[3]; // FIXME: Bogus location information. 5373ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(), 5374ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Operator, SymbolLocations); 5375ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getSema().ActOnDependentTemplateName( 5376ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 5377ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS, 5378ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name, 5379a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5380a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 5381ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor .template getAsVal<TemplateName>(); 5382ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5383ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5384ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 53851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 5388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 5389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 5390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 5391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 5392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 5393ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts(); 5394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 53951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 5397f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 5398f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (!FirstExpr->getType()->isOverloadableType() && 5399f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl !SecondExpr->getType()->isOverloadableType()) 5400f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return getSema().CreateBuiltinArraySubscriptExpr(move(First), 5401ba13543329afac4a0d01304ec2ec4924d99306a6John McCall CalleeExpr->getLocStart(), 5402f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(Second), OpLoc); 54031a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 54041a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 54051a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc); 5406f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl } else if (SecondExpr == 0 || isPostIncDec) { 5407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 5408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 5409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 54101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 54121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 54161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 5417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 5418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 5419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 5420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 54211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 5423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 54251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 5428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 5429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 54311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 5433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 5434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 54351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5436ba13543329afac4a0d01304ec2ec4924d99306a6John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) { 5437ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 5438ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 5439ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 5440ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 5441ba13543329afac4a0d01304ec2ec4924d99306a6John McCall for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(), 5442ba13543329afac4a0d01304ec2ec4924d99306a6John McCall E = ULE->decls_end(); I != E; ++I) 5443ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Functions.insert(AnyFunctionDecl::getFromNamedDecl(*I)); 5444ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 5445ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Functions.insert(AnyFunctionDecl::getFromNamedDecl( 5446ba13543329afac4a0d01304ec2ec4924d99306a6John McCall cast<DeclRefExpr>(CalleeExpr)->getDecl())); 5447ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 54481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 5450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 5451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 54521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName OpName 5453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 5454644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs, 5455644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl Functions); 54561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 5458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 54591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 5461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 5462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 54631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5464f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 5465ba13543329afac4a0d01304ec2ec4924d99306a6John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(), 5466ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 5467ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(First), 5468ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(Second)); 5469f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 5470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 54711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 5472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 54731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 5475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 54771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 54801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 5481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 5484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 5486