TreeTransform.h revision 9d125033a9853f3b572a4c9e2f9e2d4e5e346973
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 1756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// \brief Determine whether the given call argument should be dropped, e.g., 1766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// because it is a default argument. 1776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// 1786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// Subclasses can provide an alternative implementation of this routine to 1796eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// determine which kinds of call arguments get dropped. By default, 1806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// CXXDefaultArgument nodes are dropped (prior to transformation). 1816eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor bool DropCallArgument(Expr *E) { 1826eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return E->isDefaultArgument(); 1836eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 1846eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transforms the given type into another type. 186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by creating a 188a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall /// TypeSourceInfo for it and delegating to the appropriate 189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// function. This is expensive, but we don't mind, because 190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// this method is deprecated anyway; all users should be 191a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall /// switched to storing TypeSourceInfos. 192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \returns the transformed type. 194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType TransformType(QualType T); 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transforms the given type-with-location into a new 197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type-with-location. 198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// 199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by delegating to the 200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// appropriate TransformXXXType to build a new type. Subclasses 201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// may override this function (to take over all type 202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// transformations) or some set of the TransformXXXType functions 203a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// to alter the transformation. 204a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *TransformType(TypeSourceInfo *DI); 205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transform the given type-with-location into a new 207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type, collecting location information in the given builder 208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// as necessary. 209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 210a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 212657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this routine transforms a statement by delegating to the 21543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// appropriate TransformXXXStmt function to transform a specific kind of 21643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// statement or the TransformExpr() function to transform an expression. 21743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to transform statements using some 21843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// other mechanism. 21943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 22043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \returns the transformed statement. 221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformStmt(Stmt *S); 2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 223657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 224657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 231454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult TransformExpr(Expr *E); 2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 236dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 237dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Decl *TransformDecl(Decl *D) { return D; } 23943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 24043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Transform the definition of the given declaration. 24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, invokes TransformDecl() to transform the declaration. 24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 24443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); } 2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2466cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// \brief Transform the given declaration, which was the first part of a 2476cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// nested-name-specifier in a member access expression. 2486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// This specific declaration transformation only applies to the first 2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// identifier in a nested-name-specifier of a member access expression, e.g., 2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// the \c T in \c x->T::member 2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// By default, invokes TransformDecl() to transform the declaration. 2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// Subclasses may override this function to provide alternate behavior. 2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor return cast_or_null<NamedDecl>(getDerived().TransformDecl(D)); 2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor } 2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor 259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, transforms all of the types and declarations within the 262dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 263dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 265a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 266c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType = QualType(), 267c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 27081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 27181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName TransformDeclarationName(DeclarationName Name, 276dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 277dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType = QualType()); 2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 281d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and nested-name-specifiers that occur within the template name. 283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 2843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName TransformTemplateName(TemplateName Name, 2853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType = QualType()); 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this operation transforms the type, expression, or 2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// declaration stored within the template argument and constructs a 291670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 292670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 293833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// 294833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// Returns true if there was an error. 295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output); 297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall void InventTemplateArgumentLoc(const TemplateArgument &Arg, 300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &ArgLoc); 301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 302a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall /// \brief Fakes up a TypeSourceInfo for a type. 303a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *InventTypeSourceInfo(QualType T) { 304a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return SemaRef.Context.getTrivialTypeSourceInfo(T, 305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().getBaseLocation()); 306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 3071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 31385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 31485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 315dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType 316dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TransformTemplateSpecializationType(const TemplateSpecializationType *T, 317dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType); 318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType 320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransformTemplateSpecializationType(TypeLocBuilder &TLB, 321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType); 323dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 32443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 32743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 329454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult Transform##Node(Node *E); 330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 33785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 34385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 34585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \brief Build a new reference type given the type it references. 346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 34785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// By default, performs semantic analysis when building the 34885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// reference type. Subclasses may override this routine to provide 34985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// different behavior. 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 35185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \param LValue whether the type was written with an lvalue sigil 35285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// or an rvalue sigil. 35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildReferenceType(QualType ReferentType, 35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool LValue, 35585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new Objective C object pointer type. 36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildObjCObjectPointerType(QualType PointeeType, 36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 39185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 39285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 40185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 40285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVectorType(QualType ElementType, unsigned NumElements); 4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 462ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// \brief Rebuild an unresolved typename type, given the decl that 463ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// the UnresolvedUsingTypenameDecl was transformed to. 464ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType RebuildUnresolvedUsingType(Decl *D); 465ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4807da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4817da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4827da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 4837da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 4847da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 509833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateLoc, 510d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args); 5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 5151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 5241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getTypenameType(NNS, 529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 5321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 5371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildTypenameType(NestedNameSpecifier *NNS, 540833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const IdentifierInfo *Id, 541833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR) { 542833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.CheckTypenameType(NNS, *Id, SR); 543dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 5441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 549dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 550dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 551dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 552dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 553a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 554c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 555c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 556dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 557dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 558dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 559dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 562dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 574dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 575dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 576dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 578d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 579d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 580d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 581d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 582d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 583d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 584d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 586d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 587d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 588d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 589d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 590d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 591d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 592d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 593d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 594d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 595d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 5963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 5973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 5981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 599ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// \brief Build a new template name given a nested name specifier and the 600ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// overloaded operator name that is referred to as a template. 601ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// 602ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// By default, performs semantic analysis to determine whether the name can 603ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 604ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// template name. Subclasses may override this routine to provide different 605ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// behavior. 606ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 607ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 608ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType); 609ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 6311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 67199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, StmtArg Then, 67299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor SourceLocation ElseLoc, StmtArg Else) { 67399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar), 67499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), ElseLoc, move(Else)); 67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 68199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(Sema::FullExprArg Cond, 68299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar) { 68399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnStartOfSwitchStmt(Cond, DeclPtrTy::make(CondVar)); 68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 70299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, 70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 70499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, DeclPtrTy::make(CondVar), 70599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 7171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 72799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor StmtArg Init, Sema::FullExprArg Cond, 72899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, Sema::FullExprArg Inc, 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 73099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond, 73199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor DeclPtrTy::make(CondVar), 73299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Inc, RParenLoc, move(Body)); 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 78143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 784a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *Declarator, 78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 81143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 81243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 818f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 819f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 820f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL) { 821f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 822f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 823f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 824f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 825f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// \brief Build a new expression that references a declaration. 826f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// 827f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// By default, performs semantic analysis to build the new expression. 828f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Subclasses may override this routine to provide different behavior. 829a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier, 830a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 831dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *VD, SourceLocation Loc, 832dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo *TemplateArgs) { 833a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 834a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setScopeRep(Qualifier); 835a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setRange(QualifierRange); 836dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 837dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: loses template args. 838dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 839dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return getSema().BuildDeclarationNameExpr(SS, Loc, VD); 840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 853a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 858a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation DestroyedTypeLoc, 859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType, 860a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier, 861a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceRange QualifierRange) { 862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXScopeSpec SS; 863a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Qualifier) { 864a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setRange(QualifierRange); 865a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setScopeRep(Qualifier); 866a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 867a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 868aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType = ((Expr*) Base.get())->getType(); 869aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 871a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 872a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType)); 8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 874aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 875aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, isArrow, 876129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, /*FIXME: FirstQualifier*/ 0, 877129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, DestroyedTypeLoc, 878129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /*TemplateArgs*/ 0); 8791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 8821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 8886ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr)); 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 8921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 895a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo, 8965ab75172051a6d2ea71a80a79e81c65519fd3462John McCall SourceLocation OpLoc, 897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 898a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R); 899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 9131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 9271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 9441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 94983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 95083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 95183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 952f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member, 953d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *ExplicitTemplateArgs, 9548a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor NamedDecl *FirstQualifierInScope) { 955d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 956d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 957d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95983a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor Expr *BaseExpr = Base.takeAs<Expr>(); 96083a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor if (getSema().PerformObjectMemberConversion(BaseExpr, Member)) 96183a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor return getSema().ExprError(); 9628aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor 9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 96483a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor new (getSema().Context) MemberExpr(BaseExpr, isArrow, 965d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 966d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 967d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 968d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 97083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 97183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 97283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 97383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 97483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 97583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 976aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType = ((Expr*) Base.get())->getType(); 977aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 978c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall LookupResult R(getSema(), Member->getDeclName(), MemberLoc, 979c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall Sema::LookupMemberName); 980c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R.addDecl(Member); 981c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R.resolveKind(); 982c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 983aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 984aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OpLoc, isArrow, 985129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 986c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, ExplicitTemplateArgs); 987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 9966ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, 9976ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor LHS.takeAs<Expr>(), RHS.takeAs<Expr>()); 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 10011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 10091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 10141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 10189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 10239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 10411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 1048aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 1049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall CXXScopeSpec SS; 1050aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType = ((Expr*) Base.get())->getType(); 1051aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 1052129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OpLoc, /*IsArrow*/ false, 1053129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, /*FirstQualifierInScope*/ 0, 10542d1c21414199a7452f122598189363a3922605b1Douglas Gregor DeclarationName(&Accessor), 1055129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall AccessorLoc, 1056129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /* TemplateArgs */ 0); 1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1065e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor SourceLocation RBraceLoc, 1066e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor QualType ResultTy) { 1067e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor OwningExprResult Result 1068e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1069e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor if (Result.isInvalid() || ResultTy->isDependentType()) 1070e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1071e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor 1072e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // Patch in the result type we were given, which may have been computed 1073e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // when the initial InitListExpr was built. 1074e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1075e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor ILE->setType(ResultTy); 1076e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 10801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 10931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 11081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1124f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc, 1125f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian move(SubExprs)); 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 11291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 11401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 11871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 11921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 11979d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 12049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 12051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 12099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 12101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 12149d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 12151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 12161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 12181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 12209d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 12211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 12449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall LAngleLoc, 12459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 12469d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall RAngleLoc, 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12569d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 12629d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall LAngleLoc, 12639d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 12649d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall RAngleLoc, 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12749d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 12809d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall LAngleLoc, 12819d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 12829d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall RAngleLoc, 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12929d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 12989d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall LAngleLoc, 12999d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 13009d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall RAngleLoc, 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 13099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 131388650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 13159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 131788650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 13181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 13471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 13551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 13571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1358828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor QualType ThisType, 1359828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor bool isImplicit) { 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1361828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, 1362828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor isImplicit)); 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1378036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 1379036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param) { 1380036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc, 1381036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor Param)); 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 13931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 13941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 14071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 14151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 14501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 14541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1459865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS, 1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1463f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall const TemplateArgumentListInfo *TemplateArgs) { 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1467f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1468f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (TemplateArgs) 1469f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location, 1470f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall *TemplateArgs); 1471f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1472f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location); 1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1479f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 1480f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 1481f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL, 1482d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 1483f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs); 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 14914411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor SourceLocation Loc, 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 14954411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef); 14964411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, 14974411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ConvertedArgs)) 14984411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().ExprError(); 14994411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor 15004411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 15014411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor move_arg(ConvertedArgs)); 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1545865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE, 1546aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1549a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1550a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1551129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NamedDecl *FirstQualifierInScope, 1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1553c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1554129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1556a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1557a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 15581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1559aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, 1560aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1561129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 1562129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, MemberLoc, TemplateArgs); 1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1565129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Build a new member reference expression. 15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1569129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE, 1570aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1571129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 1572129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool IsArrow, 1573129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NestedNameSpecifier *Qualifier, 1574129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceRange QualifierRange, 1575c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope, 1576129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult &R, 1577129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 15783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1582aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, 1583aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1584c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall SS, FirstQualifierInScope, 1585c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, TemplateArgs); 15863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 15971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 16131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 16291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 16321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 16340da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor BuiltinLoc); 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 16361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 165643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 165943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 166243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 166543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 166643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 166743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 167143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 167243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 167443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 167543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16795ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson return getSema().ActOnExprStmt(getSema().MakeFullExpr(E)); 168043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 16811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 16851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1687670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1688454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1696454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 16981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1701657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1702657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1703657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1704dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1706a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1707c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1708c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 17090979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 17100979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 17111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 171243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1713dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 17151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1716c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1717c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 17201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1722c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1723a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1724c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 17291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1730a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1731a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1732a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1736a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1737c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1738c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 17391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1754dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1758dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1759fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1761d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1762d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1765dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1766dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1767dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1771dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1772dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1773dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 17761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1778dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1779dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 17801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 178181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1782dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 1783dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 178481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 178581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 178681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 178981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 179081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 179281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 17933e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 179481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 179581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 17961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 179781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 179881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 179981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 180081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 1801dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType T; 1802dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor if (!ObjectType.isNull() && 1803dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor isa<TemplateSpecializationType>(Name.getCXXNameType())) { 1804dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TemplateSpecializationType *SpecType 1805dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = cast<TemplateSpecializationType>(Name.getCXXNameType()); 1806dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = TransformTemplateSpecializationType(SpecType, ObjectType); 1807dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor } else 1808dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = getDerived().TransformType(Name.getCXXNameType()); 180981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 18111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 18131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 181481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 181581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 18161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 18171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 182081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 182181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 18221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 18233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 18243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1832d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 18331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1835d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1847f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they make it into the AST. 1848f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded template name survived to here"); 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1859dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 1860dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1863ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1864ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(), 1865ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1866ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 1867ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, DTN->getOperator(), 1868ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 18721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1873d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1875d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1877d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1878d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1879d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1882d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1884f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they reach the AST. 1885f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded function decl survived to here"); 1886f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return TemplateName(); 1887d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1888d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1889d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1890833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 1891833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 1892833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1893833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 1894670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1895670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 18969f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("null template argument in TreeTransform"); 1897833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1898833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1899833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 1900833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 1901a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 1902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1905788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 1906788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(Arg, SourceRange(), Loc); 1907788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor break; 1908788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1909833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 1910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 1911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 1914670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 1916828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 1917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 1923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 1924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 1926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 1927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 1928833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 1929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 19311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1932670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1933a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = Input.getTypeSourceInfo(); 1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 1935a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 1936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 1941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1942670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1944670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 1946972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 1947972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 1948972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 1949788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), Name); 1950670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 1952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1953828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 1954828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 1955828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 1956828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Action::Unevaluated); 1957828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr); 1958828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (E.isInvalid()) 1959828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = NULL; 1960828bff2079b6a91ecd7ed5b842c59527d7682789John McCall else { 1961828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = E.takeAs<Expr>(); 1962828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr->Retain(); 1963828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1964828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1965828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 1966828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 1967833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1968670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1970788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: { 1971788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName()); 1972788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateName Template 1973788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor = getDerived().TransformTemplateName(Arg.getAsTemplate()); 1974788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor if (Template.isNull()) 1975788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return true; 1976788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1977788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(TemplateArgument(Template), 1978788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateQualifierRange(), 1979788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateNameLoc()); 1980788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return false; 1981788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor } 1982788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1983670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 1984670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 19851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 1986670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 1989833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 1990833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1991833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Sema::OwningExprResult E 1992833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 1993833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 1994833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1995833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *ETaken = E.takeAs<Expr>(); 1996828bff2079b6a91ecd7ed5b842c59527d7682789John McCall ETaken->Retain(); 1997833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken); 1998833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1999670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2001670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 2002670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 2003670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 20041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 2005670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 2006670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2008833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2009833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2010833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2011828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2012828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2013828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2014828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2015833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2017828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2018670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2019670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 20201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 2021670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 2022828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Result, Input.getLocInfo()); 2023833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2027670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2028833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2029670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2030670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2042a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T); 20434802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 2044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2045a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewDI = getDerived().TransformType(DI); 20461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2054a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 2055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 2056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 20571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 20591bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 2060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 2061a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, TL); 2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2067a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TLB.getTypeSourceInfo(SemaRef.Context, Result); 2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 2076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 20819f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("unhandled type loc!"); 2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 20901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 20911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 2093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedTypeLoc T) { 2094a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers Quals = T.getType().getLocalQualifiers(); 2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 21051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make 2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work. 2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \ 2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 213385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType, \ 213485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); \ 2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \ 2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setSigilLoc(TL.getSigilLoc()); \ 2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0) 2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BuiltinTypeLoc T) { 2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ComplexTypeLoc T) { 2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointerTypeLoc TL) { 2161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(PointerType); 2162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BlockPointerTypeLoc TL) { 2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(BlockPointerType); 2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 217185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 217285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 217385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 217485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 217585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 217685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 217785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 217885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc TL) { 217985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 218085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 218185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 218285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 218385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 218485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 218585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 218685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 218785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 218885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 218985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 219085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 219185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 219285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 219385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 219485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 219585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 219685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 219785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 219885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 219985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 220085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 220485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 220585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 220685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 2207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2210a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall LValueReferenceTypeLoc TL) { 221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2212a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2214a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2215a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2216a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2217a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RValueReferenceTypeLoc TL) { 221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2223a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2224a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc TL) { 2225a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2226a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2227a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2231a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2232a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2233a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2238a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 224185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 224285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 2243a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2248a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 22531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc TL) { 2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 226885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 226985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2271a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 22771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc TL) { 2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 230285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 230385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2319a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc TL) { 2320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2325670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2326670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2327670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 234385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 23531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayTypeLoc TL) { 2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2366670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2367670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 23681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 238485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 23891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc TL) { 2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2411670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2412670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2413670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2420eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2421eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc TL) { 2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 24611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc TL) { 2468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 24851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 24891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 2492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc TL) { 2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 2494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Transform the parameters. 2499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2504a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 2508a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall assert(OldDI->getType() == T->getArgType(i)); 2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2511a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewDI = getDerived().TransformType(OldDI); 2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewDI == OldDI) 2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = OldParm; 2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else 2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = ParmVarDecl::Create(SemaRef.Context, 2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getDeclContext(), 2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getLocation(), 2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getIdentifier(), 2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI->getType(), 2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI, 2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getStorageClass(), 2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* DefArg */ NULL); 2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.push_back(NewType); 2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamDecls.push_back(NewParm); 2541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 25421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc TL) { 2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2572a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2586ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType 2587ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 2588ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UnresolvedUsingTypeLoc TL) { 2589ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UnresolvedUsingType *T = TL.getTypePtr(); 2590ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Decl *D = getDerived().TransformDecl(T->getDecl()); 2591ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (!D) 2592ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 2593ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2594ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType Result = TL.getType(); 2595ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 2596ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Result = getDerived().RebuildUnresolvedUsingType(D); 2597ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Result.isNull()) 2598ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 2599ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 2600ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2601ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // We might get an arbitrary type spec type back. We should at 2602ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // least always get a type spec type, though. 2603ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 2604ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewTL.setNameLoc(TL.getNameLoc()); 2605ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2606ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Result; 2607ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 2608ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc TL) { 2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc TL) { 2635670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2636670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2638cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 2639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2644cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall E.get() != TL.getUnderlyingExpr()) { 2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 26501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 2652cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 2653cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2654cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc TL) { 2662cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 2663cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 2664cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (!New_Under_TI) 2665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2668cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 2669cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 2670a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 26731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 2675cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 2676cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2677cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2678cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setUnderlyingTInfo(New_Under_TI); 2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc TL) { 2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2688670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2689670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2691577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2692577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2693577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc TL) { 2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2715a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 27261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc TL) { 2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 2737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2739577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2740577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2754577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27557da2431c23ef1ee8acb114e39692246e1801afc2John McCall 27567da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc TL) { 2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 27627da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 27637da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 27647da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 27651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 27787da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 27791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2781577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2782577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateTypeParmTypeLoc TL) { 2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 2786577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 27881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 278949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall SubstTemplateTypeParmTypeLoc TL) { 2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 279349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 279449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 279549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2796dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType 2797dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType( 2798a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateSpecializationTypeLoc TL) { 2800833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(TLB, TL, QualType()); 2801833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2802a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2803833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2804833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2805833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *TST, 2806833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: this entire method is a temporary workaround; callers 2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // should be rewritten to provide real type locs. 2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2810833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Fake up a TemplateSpecializationTypeLoc. 2811833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder TLB; 2812833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL 2813833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0)); 2814833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2815828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceLocation BaseLoc = getDerived().getBaseLocation(); 2816828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2817828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setTemplateNameLoc(BaseLoc); 2818828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setLAngleLoc(BaseLoc); 2819828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setRAngleLoc(BaseLoc); 2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &TA = TST->getArg(i); 2822833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc TAL; 2823833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().InventTemplateArgumentLoc(TA, TAL); 2824833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.setArgLocInfo(i, TAL.getLocInfo()); 2825833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2826833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2827833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder IgnoredTLB; 2828833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType); 2829dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 2830dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 2831dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 2832577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 2834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 2835833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2836833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 2837833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 28381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2839dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2840577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2841577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2843d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo NewTemplateArgs; 2844d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 2845d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 2846d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 2847d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) { 2848d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 2849d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc)) 2850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2851d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.addArgument(Loc); 2852d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 28531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2854833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 2855833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2856833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 2857833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 2858833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 2859d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs); 28601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2861833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 2862833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 2863833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 2864833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 2865833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 2866833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 2867833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 2868833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 2869833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 28701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2871833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 2872577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 2877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc TL) { 2878a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2881577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 2892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 2894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2898a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2902577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2905a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB, 2906a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc TL) { 2907a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameType *T = TL.getTypePtr(); 2908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2909833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /* FIXME: preserve source information better than this */ 2910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR(TL.getNameLoc()); 2911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR); 2914577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2917a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 2918a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 29201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 2921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2928577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 29291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2930a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, NewTemplateId); 2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR); 2933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result); 2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCInterfaceTypeLoc TL) { 294754e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCInterfaceType unimplemented"); 294854e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 2949577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2952a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 2954a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCObjectPointerTypeLoc TL) { 295554e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCObjectPointerType unimplemented"); 295654e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 295724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 295824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 296143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 296243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 296343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 29651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 297043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 297443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 29851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 29891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 29921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 299643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 299743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 29991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 300043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 300143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 3003264c1f8ec895952466eab59b84b8b06801e721faEli Friedman OwningExprResult LHS(SemaRef), RHS(SemaRef); 3004264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 3005264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 3006264c1f8ec895952466eab59b84b8b06801e721faEli Friedman EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 30071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3008264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 3009264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 3010264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 3011264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 30121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3013264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 3014264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 3015264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 3016264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 3017264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 30181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 302043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 303143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 303843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 304343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 304543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 304843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 306143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 306343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 30661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 30671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 306843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 30698cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor OwningExprResult Cond(SemaRef); 30708cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 30718cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 30728cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor ConditionVar 30738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 30748cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 30758cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 30768cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor return SemaRef.StmtError(); 307799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 30788cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 30798cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 308099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 308199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 308299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 30838cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 30845ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 30851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 309243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 309899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 309943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 310043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 31011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 310499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), 31051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 310643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 310743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 310943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 311143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 3112d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor OwningExprResult Cond(SemaRef); 3113d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor VarDecl *ConditionVar = 0; 3114d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (S->getConditionVariable()) { 3115d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor ConditionVar 3116d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor = cast_or_null<VarDecl>( 3117d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 3118d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (!ConditionVar) 3119d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor return SemaRef.StmtError(); 312099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 3121d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 312299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 312399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 312499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 312599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 31261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31275ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 312899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 313099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond, 313199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar); 313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 314243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 31495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor OwningExprResult Cond(SemaRef); 31505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor VarDecl *ConditionVar = 0; 31515656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (S->getConditionVariable()) { 31525656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor ConditionVar 31535656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor = cast_or_null<VarDecl>( 31545656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 31555656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (!ConditionVar) 31565656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor return SemaRef.StmtError(); 315799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 31585656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 315999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 316099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 316199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 316299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 31631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31645ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 316743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 317243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 317399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 317443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar, 317899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 318243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 320043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 320843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 321043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 321243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 321399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningExprResult Cond(SemaRef); 321499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *ConditionVar = 0; 321599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (S->getConditionVariable()) { 321699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar 321799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor = cast_or_null<VarDecl>( 321899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 321999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (!ConditionVar) 322099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 322199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 322299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 322399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 322499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 322599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 322699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 32271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 323443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 324143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 32431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 32465ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson move(Init), getSema().MakeFullExpr(Cond), 324799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar, 32485ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson getSema().MakeFullExpr(Inc), 324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 325043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 325143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 32531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 32541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 32561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 325943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 326043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 326143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 326343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 326743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 32691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 327143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 327243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 327443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 327543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 32781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 32841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 328843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 329143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 32941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 329543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 330043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 330643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 33171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 33181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 332143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 332343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 332443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 332643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 33271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 332943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 33351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 334343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 33441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 334843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 335143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 336643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 33681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 33741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 33771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 33831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 33861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 339843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 340243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 3406a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall ExceptionDecl->getTypeSourceInfo(), 340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 341043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 341143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 341443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 341943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 342243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 342343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 34291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 343843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 34401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 344143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 344343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 344643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 344743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 345143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 345543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 34611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 346343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 34641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 346543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 346743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 3469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3472454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 34751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3478454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 3479a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 3481a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3482a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor E->getQualifierRange()); 3483a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 3484a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3485a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3486dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3487dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *ND 3488dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getDecl())); 3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3492a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 3493a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 3494a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 3495dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall !E->hasExplicitTemplateArgumentList()) { 34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3497dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // Mark it referenced in the new context regardless. 3498dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: this is a bit instantiation-specific. 3499dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 3500a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3501dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return SemaRef.Owned(E->Retain()); 3502a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3503dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3504dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 3505dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall if (E->hasExplicitTemplateArgumentList()) { 3506dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgs = &TransArgs; 3507dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 3508dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 3509dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3510dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentLoc Loc; 3511dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 3512dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return SemaRef.ExprError(); 3513dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.addArgument(Loc); 3514dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 3515dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 3516dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3517a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 3518dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ND, E->getLocation(), TemplateArgs); 3519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3523454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3529454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3535454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3541454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 35421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3547454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 35481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3553454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 3554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 35651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3567454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 3568454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3582454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 3584a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 35855557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 3586a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 35875ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35905ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35935ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 35941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 35991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 36041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3620454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3643454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 36611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 36721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3682454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 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 3696f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member 3697f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman = cast_or_null<ValueDecl>(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() && 37051f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson !E->hasExplicitTemplateArgumentList()) { 37061f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson 37071f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // Mark it referenced in the new context regardless. 37081f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // FIXME: this is a bit instantiation-specific. 37091f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member); 37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37111f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson } 3712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3713d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 37148a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor if (E->hasExplicitTemplateArgumentList()) { 3715d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 3716d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 37178a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3718d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 3719d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 37208a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor return SemaRef.ExprError(); 3721d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 37228a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 37238a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 37248a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor 3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3729c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 3730c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 3731c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 3732c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 3733c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 3734c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 373783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 373883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 37408a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 3741d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall (E->hasExplicitTemplateArgumentList() 3742d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 3743c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope); 3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3748454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCastExpr(CastExpr *E) { 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 37501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3755454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 37671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 37731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3776454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CompoundAssignOperator *E) { 3777454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformBinaryOperator(E); 3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3782454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 380247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 38031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 380447e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 38091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3810454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 3811a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // Implicit casts are eliminated during transformation, since they 3812a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // will be recomputed by semantic analysis after transformation. 38136eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return getDerived().TransformExpr(E->getSubExprAsWritten()); 3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3818454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) { 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 38201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3825454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 38269d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 38279d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38349d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 38359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 38369d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3840a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 38416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 38469d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 38481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38509d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 38519d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3858454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 3859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeTypeLoc 3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 38651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 38781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3887454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 3888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 38941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 38971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3906454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 39201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3923e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3928454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 39301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 39561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 39631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 39791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 3997454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ImplicitValueInitExpr *E) { 39985557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 39995557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 40005557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 40015557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 40081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4015454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 40181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4042454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4072c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult 4073454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 40741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4090454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 40951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 41081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4116454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 41331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4142454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 41431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4148454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 4149668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor switch (E->getOperator()) { 4150668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_New: 4151668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Delete: 4152668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_New: 4153668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_Delete: 4154668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 4155668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4156668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4157668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Call: { 4158668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // This is a call to an object's operator(). 4159668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 4160668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4161668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the object itself. 4162668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor OwningExprResult Object = getDerived().TransformExpr(E->getArg(0)); 4163668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Object.isInvalid()) 4164668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4165668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4166668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor location information 4167668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeLParenLoc 4168668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4169668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Object.get())->getLocEnd()); 4170668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4171668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the call arguments. 4172668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4173668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 4174668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) { 41756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (getDerived().DropCallArgument(E->getArg(I))) 41766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor break; 41776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 4178668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 4179668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Arg.isInvalid()) 4180668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4181668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4182668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor source location information. 4183668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeCommaLoc 4184668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4185668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Arg.get())->getLocEnd()); 4186668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor FakeCommaLocs.push_back(FakeCommaLoc); 4187668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor Args.push_back(Arg.release()); 4188668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4189668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4190668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc, 4191668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor move_arg(Args), 4192668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor FakeCommaLocs.data(), 4193668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor E->getLocEnd()); 4194668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4195668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4196668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 4197668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_##Name: 4198668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 4199668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def" 4200668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Subscript: 4201668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Handled below. 4202668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor break; 4203668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4204668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Conditional: 4205668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("conditional operator is not actually overloadable"); 4206668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4207668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4208668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_None: 4209668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case NUM_OVERLOADED_OPERATORS: 4210668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("not an overloaded operator?"); 4211668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4212668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4213668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4218454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 4225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 42331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4244454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 4245454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCallExpr(E); 4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4250454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 42519d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 42529d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 42551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 42581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42599d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 42609d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 42619d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4265a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 42666eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 42719d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 42731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 4279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 42859d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4294454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 4295454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4300454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 4301454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 4307454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXReinterpretCastExpr *E) { 4308454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4313454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 4314454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 4320454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXFunctionalCastExpr *E) { 43219d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 43229d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 43251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43269d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 43279d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 43289d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4332a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 43336eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 43389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 43401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 43459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4353454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 43561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 43741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 43761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 43921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4393454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 43941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 4400454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXNullPtrLiteralExpr *E) { 44011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4406454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 44081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4417828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4422454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4436454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 44371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4446036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4451454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 44601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4470454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 4491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 449443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 4497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 45041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 45091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArraySize.get()) { 45125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // If no array size was specified, but the new expression was 45135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with an array type (e.g., "new T" where T is 45145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with "int[4]"), extract the outer bound from the 45155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // array type as our array size. We do this with constant and 45165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // dependently-sized array types. 45175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 45185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArrayT) { 45195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // Do nothing 45205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const ConstantArrayType *ConsArrayT 45215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<ConstantArrayType>(ArrayT)) { 45225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ArraySize 45235b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral( 45245b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ConsArrayT->getSize(), 45255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor SemaRef.Context.getSizeType(), 45265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor /*FIXME:*/E->getLocStart())); 45275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = ConsArrayT->getElementType(); 45285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const DependentSizedArrayType *DepArrayT 45295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<DependentSizedArrayType>(ArrayT)) { 45305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (DepArrayT->getSizeExpr()) { 45315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain()); 45325b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = DepArrayT->getElementType(); 45335b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 45345b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 45355b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 45481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4553454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 4556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 45591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Operand.get() == E->getArgument()) 45601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4570a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 4571454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXPseudoDestructorExpr *E) { 4572a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4573a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 4574a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 45751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4576a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 4577a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4578a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4579a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 4580a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 45811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4582a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 4583a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 4584a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 4585a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 4586a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 4587a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 4588a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 45891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4590a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 4591a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 4592a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 4593a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 4594a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 45951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4596a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 4597a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 4598a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 4599a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 4600a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 4601a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 4602a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4603a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 46041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4605a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 4606a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 4607ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 4608454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall UnresolvedLookupExpr *Old) { 4609f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName()); 4610f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4611f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 4612f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Sema::LookupOrdinaryName); 4613f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4614f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Transform all the decls. 4615f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 4616f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = Old->decls_end(); I != E; ++I) { 4617f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I)); 46189f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 46199f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 46209f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 46219f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 46229f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 46239f54ad4381370c6b771424b53d219e661d6d6706John McCall else 46249f54ad4381370c6b771424b53d219e661d6d6706John McCall return SemaRef.ExprError(); 46259f54ad4381370c6b771424b53d219e661d6d6706John McCall } 4626f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4627f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Expand using declarations. 4628f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (isa<UsingDecl>(InstD)) { 4629f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 4630f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 4631f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = UD->shadow_end(); I != E; ++I) 4632f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(*I); 4633f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall continue; 4634f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4635f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4636f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(InstD); 4637f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4638f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4639f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Resolve a kind, but don't do any further analysis. If it's 4640f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // ambiguous, the callee needs to deal with it. 4641f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.resolveKind(); 4642f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4643f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Rebuild the nested-name qualifier, if present. 4644f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 4645f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NestedNameSpecifier *Qualifier = 0; 4646f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Old->getQualifier()) { 4647f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 4648f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Old->getQualifierRange()); 4649f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Qualifier) 4650f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4652f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setScopeRep(Qualifier); 4653f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setRange(Old->getQualifierRange()); 4654f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have no template arguments, it's a normal declaration name. 4657f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Old->hasExplicitTemplateArgs()) 4658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 4659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have template arguments, rebuild them, then rebuild the 4661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // templateid expression. 4662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 4663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 4664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentLoc Loc; 4665f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc)) 4666f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4667f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs.addArgument(Loc); 4668f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4669f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4670f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(), 4671f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs); 4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4676454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 46781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 46901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4700865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 4701454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall DependentScopeDeclRefExpr *E) { 4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4703f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4704f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 470981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 471081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 471181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 47121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4713f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!E->hasExplicitTemplateArgs()) { 4714f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!getDerived().AlwaysRebuild() && 4715f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NNS == E->getQualifier() && 4716f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name == E->getDeclName()) 4717f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.Owned(E->Retain()); 47181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4719f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4720f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 4721f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 4722f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /*TemplateArgs*/ 0); 4723f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 4724d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 4725d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4727d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4728d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4730d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4733f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4734f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 4735f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 4736f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall &TransArgs); 4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4741454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 47596eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (getDerived().DropCallArgument(*Arg)) { 47606eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor ArgumentChanged = true; 47616eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor break; 47626eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 47636eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47784411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 47794411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor Constructor, E->isElidable(), 4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 47855132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 47865132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that. 4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4789454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 47905132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 47965132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we 47975132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that. 4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 48015132655e4296b780672e9a96b46a740135073534Douglas Gregor CXXExprWithTemporaries *E) { 48025132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 4808454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXTemporaryObjectExpr *E) { 4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 48231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 48391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 48441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 4858454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXUnresolvedConstructExpr *E) { 4859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 48831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4896865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 4897454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXDependentScopeMemberExpr *E) { 4898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4899aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OwningExprResult Base(SemaRef, (Expr*) 0); 4900aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *OldBase; 4901aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 4902aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType ObjectType; 4903aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->isImplicitAccess()) { 4904aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = E->getBase(); 4905aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(OldBase); 4906aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 4907aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 49081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall // Start the member reference and compute the object's type. 4910aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Sema::TypeTy *ObjectTy = 0; 4911aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4912aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall E->getOperatorLoc(), 4913a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4914aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectTy); 4915aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 4916aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 4917aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 4918aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = QualType::getFromOpaquePtr(ObjectTy); 4919aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 4920aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 4921aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = 0; 4922aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(E->getBaseType()); 4923aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 4924aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 49251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49266cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 49276cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 4928c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 49296cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 49306cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 49316cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 49321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4933a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4934a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4935a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4936a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4937aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType, 4938aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall FirstQualifierInScope); 4939a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4940a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4941a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 49421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 4944dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 4945aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType); 494681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 494781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 49481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4949aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->hasExplicitTemplateArgs()) { 49503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 49513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 49523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 4953aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base.get() == OldBase && 4954aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType == E->getBaseType() && 49553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 49563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 49573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 49581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 49591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4960865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 4961aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 49623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 49633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 49643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 49653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 4966129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall FirstQualifierInScope, 49673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 49683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 4969129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /*TemplateArgs*/ 0); 49703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 49713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 4972d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 49733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4974d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4975d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 49763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 4977d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 49783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 49791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4980865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 4981aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4984a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4985a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 49863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 4987129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, 4988129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E->getMemberLoc(), 4989129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall &TransArgs); 4990129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 4991129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 4992129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived> 4993129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult 4994454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 4995129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform the base of the expression. 4996aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OwningExprResult Base(SemaRef, (Expr*) 0); 4997aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 4998aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Old->isImplicitAccess()) { 4999aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(Old->getBase()); 5000aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 5001aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 5002aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 5003aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 5004aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(Old->getBaseType()); 5005aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 5006129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5007129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NestedNameSpecifier *Qualifier = 0; 5008129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->getQualifier()) { 5009129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier 5010129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 5011129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getQualifierRange()); 5012129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Qualifier == 0) 5013129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return SemaRef.ExprError(); 5014129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5015129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5016129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(), 5017129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Sema::LookupOrdinaryName); 5018129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5019129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform all the decls. 5020129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 5021129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = Old->decls_end(); I != E; ++I) { 5022129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I)); 50239f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 50249f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 50259f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 50269f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 50279f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 50289f54ad4381370c6b771424b53d219e661d6d6706John McCall else 50299f54ad4381370c6b771424b53d219e661d6d6706John McCall return SemaRef.ExprError(); 50309f54ad4381370c6b771424b53d219e661d6d6706John McCall } 5031129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5032129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Expand using declarations. 5033129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (isa<UsingDecl>(InstD)) { 5034129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 5035129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 5036129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = UD->shadow_end(); I != E; ++I) 5037129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(*I); 5038129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall continue; 5039129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5040129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5041129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(InstD); 5042129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5043129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5044129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.resolveKind(); 5045129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5046129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentListInfo TransArgs; 5047129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->hasExplicitTemplateArgs()) { 5048129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setLAngleLoc(Old->getLAngleLoc()); 5049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setRAngleLoc(Old->getRAngleLoc()); 5050129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 5051129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentLoc Loc; 5052129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], 5053129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Loc)) 5054129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return SemaRef.ExprError(); 5055129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.addArgument(Loc); 5056129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5057129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5058c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 5059c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 5060c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 5061c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 5062c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 5063c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 5064129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5065129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return getDerived().RebuildUnresolvedMemberExpr(move(Base), 5066aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 5067129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getOperatorLoc(), 5068129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->isArrow(), 5069129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier, 5070129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getQualifierRange(), 5071c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope, 5072129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R, 5073129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall (Old->hasExplicitTemplateArgs() 5074129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall ? &TransArgs : 0)); 5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5079454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5085454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 5090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 50941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 5097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 5098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 51001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5103454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 5104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5111454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 51121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5117454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 51181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 5120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 5121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 5122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 5123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 51261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 51271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 5130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 5131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 5132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 51331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5138454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5146454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 5147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 515409105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 5155454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ObjCImplicitSetterGetterRefExpr *E) { 5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5163454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5171454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5179454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 5180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 5183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 51861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 5188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 5189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 51901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 51931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 51941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 5196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 5197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 52011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5202454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 52051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 52091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5210454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 5211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 52131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 52151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 5218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 522185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 522285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 522385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star, 5224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 522885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 522985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 523085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star, 5231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 52351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 523685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 523785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 523885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 523985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(), 524085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 52441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 524585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 524685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 524785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 52480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 524985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5250577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 52531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 525485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType, 525585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 525685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil, 5257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseEntity()); 5258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5259a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 5262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 5263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 5265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 5266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 5268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 5269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 5270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 5271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 52721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 52741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 52751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 52761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 5277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 5278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 5279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 5280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 5281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 5282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 5283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 5284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 52851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 52871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 5288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 52891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 5290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 52931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 52941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 5295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 529785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 529885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 52991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 530085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 53041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 53051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 5306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 530785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 530885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 531085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 53141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 53151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 5316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 53201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 53261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 53271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 5328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 53321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 5339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 5340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 5341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 5342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 5346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 5347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 5349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 5350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 53511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 5352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 5354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 53581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 53591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 5360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 5363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 53671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 5368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 53691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 5370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 53711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 5372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 5373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 5374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 5375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 5379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 5380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5383ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 5384ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(D && "no decl found"); 5385ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (D->isInvalidDecl()) return QualType(); 5386ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5387ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeDecl *Ty; 5388ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (isa<UsingDecl>(D)) { 5389ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Using = cast<UsingDecl>(D); 5390ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(Using->isTypeName() && 5391ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-typename using"); 5392ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5393ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // A valid resolved using typename decl points to exactly one type decl. 5394ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(++Using->shadow_begin() == Using->shadow_end()); 5395ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 5396ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5397ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } else { 5398ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(isa<UnresolvedUsingTypenameDecl>(D) && 5399ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-using decl"); 5400ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<UnresolvedUsingTypenameDecl>(D); 5401ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 5402ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5403ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return SemaRef.Context.getTypeDeclType(Ty); 5404ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 5405ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5406ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> 5407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 5408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 5409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 5413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 5414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 5418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 5419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 5423833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 5424833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 5425d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 5426d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 5427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 54281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5429dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5430dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5431dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5432dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5433a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 5434c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 5435d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NamedDecl *FirstQualifierInScope) { 5436dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 5437dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 5438dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 5439dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 5440dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 54411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 5442495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 5443c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 5444c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 544546646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner false, false)); 5446dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5447dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5448dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5449dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5450dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5451dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5452dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 5453dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 5454dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5455dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5456dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5457dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5458dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5459dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5460dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 5461dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 5462dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 5463dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 5464a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here"); 5465dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 5466dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 5467dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 54681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5469dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 5470dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 5471dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 54721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5473d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 54741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5475d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5476d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5477d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 54781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 5479d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 5480d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5481d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5482d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 54831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5484d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 54853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 54863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 5487d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 5488d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 54891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 5490014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor UnqualifiedId Name; 5491014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation()); 54923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 54933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 54943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 5495014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name, 5496a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5497a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 54983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 5499d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 55001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5502ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5503ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5504ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 5505ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 5506ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor CXXScopeSpec SS; 5507ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 5508ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setScopeRep(Qualifier); 5509ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 5510ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SourceLocation SymbolLocations[3]; // FIXME: Bogus location information. 5511ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(), 5512ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Operator, SymbolLocations); 5513ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getSema().ActOnDependentTemplateName( 5514ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 5515ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS, 5516ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name, 5517a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5518a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 5519ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor .template getAsVal<TemplateName>(); 5520ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5521ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5522ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 55231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 5525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 5526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 5527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 5528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 5529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 5530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 5531ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts(); 5532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 55331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 5535f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 5536f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (!FirstExpr->getType()->isOverloadableType() && 5537f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl !SecondExpr->getType()->isOverloadableType()) 5538f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return getSema().CreateBuiltinArraySubscriptExpr(move(First), 5539ba13543329afac4a0d01304ec2ec4924d99306a6John McCall CalleeExpr->getLocStart(), 5540f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(Second), OpLoc); 55411a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 55421a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 55431a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc); 5544f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl } else if (SecondExpr == 0 || isPostIncDec) { 5545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 5546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 5547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 55481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 55501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 55541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 5555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 5556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 55591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 55631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 5566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 5567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 5571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 5572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 55731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5574ba13543329afac4a0d01304ec2ec4924d99306a6John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) { 5575ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 5576ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 5577ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 5578ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 5579ba13543329afac4a0d01304ec2ec4924d99306a6John McCall for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(), 5580ba13543329afac4a0d01304ec2ec4924d99306a6John McCall E = ULE->decls_end(); I != E; ++I) 5581ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Functions.insert(AnyFunctionDecl::getFromNamedDecl(*I)); 5582ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 5583ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Functions.insert(AnyFunctionDecl::getFromNamedDecl( 5584ba13543329afac4a0d01304ec2ec4924d99306a6John McCall cast<DeclRefExpr>(CalleeExpr)->getDecl())); 5585ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 55861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 5588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 5589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 55901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName OpName 5591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 5592644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs, 5593644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl Functions); 55941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 5596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 55971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 5599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 5600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 56011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5602f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 5603ba13543329afac4a0d01304ec2ec4924d99306a6John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(), 5604ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 5605ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(First), 5606ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(Second)); 5607f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 5608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 56091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 56111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 56151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 56181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 5619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 56201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 5622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 5624