TreeTransform.h revision ddf889a2ad2888f1dea573987bbe952d9912c1a0
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) { 1021b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 1022b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall move(SubExpr)); 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 10261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 10381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 1045aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 1046129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall CXXScopeSpec SS; 1047aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType = ((Expr*) Base.get())->getType(); 1048aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 1049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OpLoc, /*IsArrow*/ false, 1050129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, /*FirstQualifierInScope*/ 0, 10512d1c21414199a7452f122598189363a3922605b1Douglas Gregor DeclarationName(&Accessor), 1052129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall AccessorLoc, 1053129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /* TemplateArgs */ 0); 1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 10571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1062e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor SourceLocation RBraceLoc, 1063e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor QualType ResultTy) { 1064e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor OwningExprResult Result 1065e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1066e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor if (Result.isInvalid() || ResultTy->isDependentType()) 1067e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1068e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor 1069e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // Patch in the result type we were given, which may have been computed 1070e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // when the initial InitListExpr was built. 1071e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1072e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor ILE->setType(ResultTy); 1073e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 11051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 11151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1121f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc, 1122f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian move(SubExprs)); 1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 11761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 11949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 12019d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 12021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 12069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 12071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 12119d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 12131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 12151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 12179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 12181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1240c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 1241c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1242c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1243c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12529d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1257c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 1258c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1259c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1260c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12699d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1274c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1275c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1276c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1277c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12869d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1291c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 1292c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1293c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1294c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 13029d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 130688650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 13089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 131088650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 13111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 13401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 13431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1351828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor QualType ThisType, 1352828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor bool isImplicit) { 1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1354828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, 1355828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor isImplicit)); 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1371036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 1372036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param) { 1373036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc, 1374036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor Param)); 1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 13861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 13871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 14081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 14431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 14471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1452865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS, 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1456f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall const TemplateArgumentListInfo *TemplateArgs) { 1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1460f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1461f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (TemplateArgs) 1462f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location, 1463f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall *TemplateArgs); 1464f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1465f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location); 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1472f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 1473f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 1474f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL, 1475d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 1476f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs); 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 14844411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor SourceLocation Loc, 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 14884411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef); 14894411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, 14904411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ConvertedArgs)) 14914411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().ExprError(); 14924411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor 14934411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 14944411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor move_arg(ConvertedArgs)); 1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1538865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE, 1539aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1542a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1543a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1544129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NamedDecl *FirstQualifierInScope, 1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1546c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1547129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1549a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1550a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 15511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1552aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, 1553aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1554129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 1555129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, MemberLoc, TemplateArgs); 1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1558129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Build a new member reference expression. 15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1562129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE, 1563aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1564129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 1565129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool IsArrow, 1566129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NestedNameSpecifier *Qualifier, 1567129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceRange QualifierRange, 1568c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope, 1569129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult &R, 1570129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 15713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1575aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, 1576aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1577c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall SS, FirstQualifierInScope, 1578c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, TemplateArgs); 15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 15801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 15901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 16061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 16171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 16221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 16251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 16270da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor BuiltinLoc); 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 16291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 164943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 165043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 165143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 165243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 165543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 165943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 166043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 166143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 166443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 166543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 166643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 166743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 166943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 167043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16725ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson return getSema().ActOnExprStmt(getSema().MakeFullExpr(E)); 167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 16741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 16781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1680670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1681454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 1682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1689454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 16911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1694657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1695657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1696657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1697dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1699a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1700c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1701c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 17020979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 17030979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 17041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 170543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 17081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1709c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1710c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1711dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1712dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 17131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1715c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1716a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1717c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1723a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1724a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1725a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1726dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1729a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1730c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1731c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 17321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1736dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1752fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1754d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1755d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1758dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1765dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1766dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 17691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1770dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1771dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1772dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 17731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 177481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1775dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 1776dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 177781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 177881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 177981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 178081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 178181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 178281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 178381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 178481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 178581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 17863e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 179081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 179281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 179381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 1794dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType T; 1795dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor if (!ObjectType.isNull() && 1796dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor isa<TemplateSpecializationType>(Name.getCXXNameType())) { 1797dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TemplateSpecializationType *SpecType 1798dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = cast<TemplateSpecializationType>(Name.getCXXNameType()); 1799dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = TransformTemplateSpecializationType(SpecType, ObjectType); 1800dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor } else 1801dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = getDerived().TransformType(Name.getCXXNameType()); 180281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 180381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 18041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 180581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 180781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 180881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 18091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 181281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 181381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 181481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 18151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 18163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 18173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1818d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 18191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1820d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1821d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1822d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1831d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1832d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1837d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1840f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they make it into the AST. 1841f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded template name survived to here"); 1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1852dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 1853dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1856ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1857ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(), 1858ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1859ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 1860ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, DTN->getOperator(), 1861ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 18651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1870d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1875d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1877f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they reach the AST. 1878f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded function decl survived to here"); 1879f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return TemplateName(); 1880d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1882d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1883833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 1884833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 1885833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1886833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 1887670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1888670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 18899f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("null template argument in TreeTransform"); 1890833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1891833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1892833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 1893833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 1894a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 1895833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1896833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1897833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1898788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 1899788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(Arg, SourceRange(), Loc); 1900788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor break; 1901788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 1903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 1904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1905833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1906833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 1907670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 1909828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 1910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 1912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 1915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 1916833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 1917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 1923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 19241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1925670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1926a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = Input.getTypeSourceInfo(); 1927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 1928a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 1929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1935670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1937670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 1939972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 1940972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 1941972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 1942788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), Name); 1943670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1946828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 1947828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 1948828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 1949828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Action::Unevaluated); 1950828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr); 1951828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (E.isInvalid()) 1952828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = NULL; 1953828bff2079b6a91ecd7ed5b842c59527d7682789John McCall else { 1954828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = E.takeAs<Expr>(); 1955828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr->Retain(); 1956828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1957828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1958828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 1959828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 1960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1961670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1963788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: { 1964788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName()); 1965788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateName Template 1966788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor = getDerived().TransformTemplateName(Arg.getAsTemplate()); 1967788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor if (Template.isNull()) 1968788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return true; 1969788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1970788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(TemplateArgument(Template), 1971788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateQualifierRange(), 1972788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateNameLoc()); 1973788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return false; 1974788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor } 1975788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1976670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 1977670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 19781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 1979670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 19801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1981833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 1982833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 1983833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1984833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Sema::OwningExprResult E 1985833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 1986833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 1987833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *ETaken = E.takeAs<Expr>(); 1989828bff2079b6a91ecd7ed5b842c59527d7682789John McCall ETaken->Retain(); 1990833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken); 1991833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1992670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1994670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 1995670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 1996670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 19971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 1998670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 1999670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 20001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2001833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2002833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2003833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2004828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2005828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2006828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2007828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2008833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2009833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2010828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2011670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2012670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 20131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 2014670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 2015828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Result, Input.getLocInfo()); 2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2017670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2018670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2020670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2021833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2022670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2023670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2026577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 2030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 20321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2034a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2035a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T); 20364802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 2037a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2038a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewDI = getDerived().TransformType(DI); 20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2047a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 2048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 2049a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 20521bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 2053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 2054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, TL); 2057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2060a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TLB.getTypeSourceInfo(SemaRef.Context, Result); 2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 2066a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 2068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 2069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 2072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 20749f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("unhandled type loc!"); 2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 2080a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 2081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 20831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 20841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedTypeLoc T) { 2087a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers Quals = T.getType().getLocalQualifiers(); 2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 2090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2091577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 20981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make 2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work. 2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \ 2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 212685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType, \ 212785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); \ 2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \ 2133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setSigilLoc(TL.getSigilLoc()); \ 2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0) 2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BuiltinTypeLoc T) { 2141ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 2142ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.setBuiltinLoc(T.getBuiltinLoc()); 2143ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor if (T.needsExtraLocalData()) 2144ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 2145ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return T.getType(); 2146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ComplexTypeLoc T) { 2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointerTypeLoc TL) { 2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(PointerType); 2159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BlockPointerTypeLoc TL) { 2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(BlockPointerType); 2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 216885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 216985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 217085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 217185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 217285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 217385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 217485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 217585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc TL) { 217685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 217785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 217885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 217985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 218085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 218185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 218285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 218385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 218485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 218585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 218685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 218785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 218885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 218985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 219085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 219185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 219285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 219385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 219485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 219585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 219685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 219785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 219885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 219985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 220085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 2204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall LValueReferenceTypeLoc TL) { 220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2211a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2212a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2213a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2214a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RValueReferenceTypeLoc TL) { 221585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2220a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2221a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc TL) { 2222a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2223a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2224a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2228a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2229a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2230a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2235a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2236a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 223885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 223985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2241a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2242a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2252a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc TL) { 2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2259a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 226585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 226685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2268a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2271a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 22741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc TL) { 2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2294a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 229985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 230085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc TL) { 2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2322670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2323670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2324670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2332a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 234085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 23501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayTypeLoc TL) { 2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2363670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2364670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 23651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 238185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 23861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc TL) { 2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2408670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2409670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2410670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2417eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2418eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc TL) { 2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 24581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc TL) { 2465a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 24821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 24861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 2489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc TL) { 2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 2491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2495a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Transform the parameters. 2496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2504a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 2505a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 2506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall assert(OldDI->getType() == T->getArgType(i)); 2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2508a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewDI = getDerived().TransformType(OldDI); 2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewDI == OldDI) 2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = OldParm; 2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else 2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = ParmVarDecl::Create(SemaRef.Context, 2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getDeclContext(), 2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getLocation(), 2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getIdentifier(), 2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI->getType(), 2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI, 2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getStorageClass(), 2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* DefArg */ NULL); 2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.push_back(NewType); 2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamDecls.push_back(NewParm); 2538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 25391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc TL) { 2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2572a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2583ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType 2584ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 2585ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UnresolvedUsingTypeLoc TL) { 2586ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UnresolvedUsingType *T = TL.getTypePtr(); 2587ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Decl *D = getDerived().TransformDecl(T->getDecl()); 2588ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (!D) 2589ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 2590ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2591ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType Result = TL.getType(); 2592ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 2593ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Result = getDerived().RebuildUnresolvedUsingType(D); 2594ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Result.isNull()) 2595ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 2596ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 2597ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2598ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // We might get an arbitrary type spec type back. We should at 2599ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // least always get a type spec type, though. 2600ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 2601ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewTL.setNameLoc(TL.getNameLoc()); 2602ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2603ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Result; 2604ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 2605ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc TL) { 2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc TL) { 2632670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2633670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2635cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 2636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2641cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall E.get() != TL.getUnderlyingExpr()) { 2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 26471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 2649cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 2650cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2651cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2657a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc TL) { 2659cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 2660cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 2661cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (!New_Under_TI) 2662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2665cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 2666cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 26701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 2672cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 2673cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2674cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2675cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setUnderlyingTInfo(New_Under_TI); 2676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc TL) { 2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2685670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2686670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2688577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc TL) { 2710a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 2711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 27231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2728577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc TL) { 2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 2734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2736577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2751577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27527da2431c23ef1ee8acb114e39692246e1801afc2John McCall 27537da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc TL) { 2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 27597da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 27607da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 27617da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 27621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 27757da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 27761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2778577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2779577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateTypeParmTypeLoc TL) { 2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 2783577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 27851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 278649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall SubstTemplateTypeParmTypeLoc TL) { 2789a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 279049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 279149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 279249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2793dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType 2794dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType( 2795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2796a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateSpecializationTypeLoc TL) { 2797833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(TLB, TL, QualType()); 2798833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2800833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2801833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2802833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *TST, 2803833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2804833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: this entire method is a temporary workaround; callers 2805833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // should be rewritten to provide real type locs. 2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Fake up a TemplateSpecializationTypeLoc. 2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder TLB; 2809833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL 2810833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0)); 2811833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2812828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceLocation BaseLoc = getDerived().getBaseLocation(); 2813828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2814828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setTemplateNameLoc(BaseLoc); 2815828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setLAngleLoc(BaseLoc); 2816828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setRAngleLoc(BaseLoc); 2817833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2818833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &TA = TST->getArg(i); 2819833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc TAL; 2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().InventTemplateArgumentLoc(TA, TAL); 2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.setArgLocInfo(i, TAL.getLocInfo()); 2822833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2823833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2824833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder IgnoredTLB; 2825833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType); 2826dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 2827dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 2828dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 2829577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2830833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 2831833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 2832833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 2834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 28351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2836dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2837577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2838577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2840d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo NewTemplateArgs; 2841d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 2842d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 2843d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 2844d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) { 2845d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 2846d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc)) 2847577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2848d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.addArgument(Loc); 2849d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 28501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2851833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 2852833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2853833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 2854833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 2855833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 2856d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs); 28571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2858833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 2859833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 2860833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 2861833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 2862833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 2863833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 2864833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 2865833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 2866833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2868833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 2869577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 2874a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc TL) { 2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 2876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2878577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2886a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 2891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 2896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2897a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2898a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2902a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB, 2903a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc TL) { 2904a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameType *T = TL.getTypePtr(); 2905833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2906833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /* FIXME: preserve source information better than this */ 2907833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR(TL.getNameLoc()); 2908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR); 2911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2914a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 2915a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 29171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 2918577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2920577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2924577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 29261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, NewTemplateId); 2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR); 2930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2933a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result); 2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2936577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2942a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 2943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCInterfaceTypeLoc TL) { 294454e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCInterfaceType unimplemented"); 294554e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 2946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCObjectPointerTypeLoc TL) { 295254e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCObjectPointerType unimplemented"); 295354e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 295424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 295524fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 295743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 295843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 295943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 29621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 296343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 296443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 296543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 297043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 297443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 29821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 29861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 29891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 299243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 29961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 3000264c1f8ec895952466eab59b84b8b06801e721faEli Friedman OwningExprResult LHS(SemaRef), RHS(SemaRef); 3001264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 3002264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 3003264c1f8ec895952466eab59b84b8b06801e721faEli Friedman EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 30041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3005264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 3006264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 3007264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 3008264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3010264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 3011264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 3012264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 3013264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 3014264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 30151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 302043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 303043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 304143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 304543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 304643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 305443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 305843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 30631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 30641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 30668cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor OwningExprResult Cond(SemaRef); 30678cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 30688cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 30698cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor ConditionVar 30708cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 30718cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 30728cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 30738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor return SemaRef.StmtError(); 307499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 30758cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 30768cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 307799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 307899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 307999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 30808cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 30815ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 30821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 309599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 30981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 30991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 310199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), 31021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 310343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 310443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 310643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 3109d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor OwningExprResult Cond(SemaRef); 3110d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor VarDecl *ConditionVar = 0; 3111d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (S->getConditionVariable()) { 3112d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor ConditionVar 3113d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor = cast_or_null<VarDecl>( 3114d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 3115d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (!ConditionVar) 3116d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor return SemaRef.StmtError(); 311799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 3118d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 311999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 312099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 312199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 312299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 31231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31245ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 312599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 312799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond, 312899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar); 312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 314543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 31465656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor OwningExprResult Cond(SemaRef); 31475656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor VarDecl *ConditionVar = 0; 31485656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (S->getConditionVariable()) { 31495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor ConditionVar 31505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor = cast_or_null<VarDecl>( 31515656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 31525656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (!ConditionVar) 31535656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor return SemaRef.StmtError(); 315499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 31555656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 315699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 315799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 315899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 315999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31615ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 31621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 316543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 317099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 317143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar, 317599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 318043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 318243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 318843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 321099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningExprResult Cond(SemaRef); 321199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *ConditionVar = 0; 321299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (S->getConditionVariable()) { 321399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar 321499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor = cast_or_null<VarDecl>( 321599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 321699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (!ConditionVar) 321799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 321899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 321999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 322099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 322199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 322299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 322399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 32241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 322643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 322743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 323843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 32401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 32435ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson move(Init), getSema().MakeFullExpr(Cond), 324499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar, 32455ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson getSema().MakeFullExpr(Inc), 324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 324743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 324843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 32501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 32511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 32531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 325443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 325643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 326043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 326143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 326243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 32661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 326743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 327143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 327243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 32751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 32811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 328843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 32911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 329443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 330043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 33141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 33151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 331743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 331843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 332143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 332343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 33241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 332543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 332643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 332743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 332943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 33321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 33411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 334843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 33571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 33651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 336643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 337043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 33741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 33801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 33831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 339843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 340243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 3403a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall ExceptionDecl->getTypeSourceInfo(), 340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 340643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 341043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 341143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 341743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 341943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 34261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 34371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 343843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 344343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 344443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 34461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 344743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 344943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 34611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 346443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 3465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 3466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 34671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3469454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 34721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3475454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 3476a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3477a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 3478a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3479a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor E->getQualifierRange()); 3480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 3481a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3482a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3483dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3484dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *ND 3485dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getDecl())); 3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3489a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 3490a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 3491a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 3492dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall !E->hasExplicitTemplateArgumentList()) { 34931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3494dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // Mark it referenced in the new context regardless. 3495dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: this is a bit instantiation-specific. 3496dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 3497a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3498dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return SemaRef.Owned(E->Retain()); 3499a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3500dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3501dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 3502dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall if (E->hasExplicitTemplateArgumentList()) { 3503dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgs = &TransArgs; 3504dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 3505dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 3506dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3507dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentLoc Loc; 3508dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 3509dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return SemaRef.ExprError(); 3510dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.addArgument(Loc); 3511dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 3512dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 3513dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3514a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 3515dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ND, E->getLocation(), TemplateArgs); 3516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3520454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 35211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3526454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 35271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3532454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 35331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3538454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 35391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3544454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 35451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3550454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 3551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 35621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3564454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 3565454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3579454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 3581a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 35825557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 3583a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 35845ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35875ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35905ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 35961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 36011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3617454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3640454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 36581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3679454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 3680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 368483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 368583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 36861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 368783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 368883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange()); 3689c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 369083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 369183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 36921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3693f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member 3694f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 370083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 37018a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member == E->getMemberDecl() && 37021f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson !E->hasExplicitTemplateArgumentList()) { 37031f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson 37041f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // Mark it referenced in the new context regardless. 37051f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // FIXME: this is a bit instantiation-specific. 37061f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member); 37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37081f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson } 3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3710d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 37118a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor if (E->hasExplicitTemplateArgumentList()) { 3712d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 3713d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 37148a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3715d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 3716d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 37178a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor return SemaRef.ExprError(); 3718d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 37198a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 37208a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 37218a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor 3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3726c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 3727c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 3728c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 3729c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 3730c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 3731c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 3732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 373483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 373583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 37378a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 3738d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall (E->hasExplicitTemplateArgumentList() 3739d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 3740c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope); 3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3745454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCastExpr(CastExpr *E) { 3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 37471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3752454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 37641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 37701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3773454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CompoundAssignOperator *E) { 3774454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformBinaryOperator(E); 3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3779454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 379947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 380147e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 38061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3807454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 3808a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // Implicit casts are eliminated during transformation, since they 3809a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // will be recomputed by semantic analysis after transformation. 38106eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return getDerived().TransformExpr(E->getSubExprAsWritten()); 3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3815454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) { 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 38171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3822454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 38239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 38249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 38301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38319d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 38329d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 38339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3837a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 38386eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 38439d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 38451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38479d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 38489d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3855454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeTypeLoc 3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 38621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 38751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3884454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 38941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3903454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 39051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 39171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3920e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3925454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 39271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 392843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 39531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 39601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 39731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 3994454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ImplicitValueInitExpr *E) { 39955557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 39965557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 39975557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 39985557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4012454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 40151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4039454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4063454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4069c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult 4070454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 40711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4087454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 40921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 41051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4113454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 41301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4139454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 41401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4145454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 4146668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor switch (E->getOperator()) { 4147668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_New: 4148668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Delete: 4149668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_New: 4150668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_Delete: 4151668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 4152668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4153668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4154668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Call: { 4155668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // This is a call to an object's operator(). 4156668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 4157668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4158668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the object itself. 4159668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor OwningExprResult Object = getDerived().TransformExpr(E->getArg(0)); 4160668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Object.isInvalid()) 4161668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4162668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4163668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor location information 4164668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeLParenLoc 4165668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4166668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Object.get())->getLocEnd()); 4167668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4168668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the call arguments. 4169668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4170668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 4171668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) { 41726eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (getDerived().DropCallArgument(E->getArg(I))) 41736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor break; 41746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 4175668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 4176668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Arg.isInvalid()) 4177668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4178668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4179668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor source location information. 4180668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeCommaLoc 4181668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4182668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Arg.get())->getLocEnd()); 4183668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor FakeCommaLocs.push_back(FakeCommaLoc); 4184668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor Args.push_back(Arg.release()); 4185668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4186668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4187668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc, 4188668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor move_arg(Args), 4189668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor FakeCommaLocs.data(), 4190668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor E->getLocEnd()); 4191668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4192668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4193668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 4194668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_##Name: 4195668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 4196668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def" 4197668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Subscript: 4198668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Handled below. 4199668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor break; 4200668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4201668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Conditional: 4202668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("conditional operator is not actually overloadable"); 4203668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4204668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4205668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_None: 4206668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case NUM_OVERLOADED_OPERATORS: 4207668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("not an overloaded operator?"); 4208668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4209668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4210668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4215454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 42301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4241454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 4242454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCallExpr(E); 4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4247454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 42489d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 42499d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 42521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 42551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42569d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 42579d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 42589d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4262a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 42636eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 42689d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 42701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 42731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 4276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 4279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 42801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 42829d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4291454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 4292454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4297454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 4298454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 4304454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXReinterpretCastExpr *E) { 4305454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4310454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 4311454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 4317454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXFunctionalCastExpr *E) { 43189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 43199d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 43221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 43249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 43259d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4329a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 43306eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 43359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 43429d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4350454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 43531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 43711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 43731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 43891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4390454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 43911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 4397454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXNullPtrLiteralExpr *E) { 43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4403454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 44051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4414828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4419454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 44261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4433454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 44341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4443036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4448454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4467454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 449143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 4500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 45011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 4504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 4505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 45061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45085b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArraySize.get()) { 45095b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // If no array size was specified, but the new expression was 45105b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with an array type (e.g., "new T" where T is 45115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with "int[4]"), extract the outer bound from the 45125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // array type as our array size. We do this with constant and 45135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // dependently-sized array types. 45145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 45155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArrayT) { 45165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // Do nothing 45175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const ConstantArrayType *ConsArrayT 45185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<ConstantArrayType>(ArrayT)) { 45195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ArraySize 45205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral( 45215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ConsArrayT->getSize(), 45225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor SemaRef.Context.getSizeType(), 45235b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor /*FIXME:*/E->getLocStart())); 45245b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = ConsArrayT->getElementType(); 45255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const DependentSizedArrayType *DepArrayT 45265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<DependentSizedArrayType>(ArrayT)) { 45275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (DepArrayT->getSizeExpr()) { 45285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain()); 45295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = DepArrayT->getElementType(); 45305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 45315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 45325b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 45451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4550454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 4551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 45561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Operand.get() == E->getArgument()) 45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4567a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 4568454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXPseudoDestructorExpr *E) { 4569a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4570a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 4571a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 45721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4573a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 4574a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4575a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4576a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 4577a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 45781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4579a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 4580a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 4581a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 4582a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 4583a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 4584a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 4585a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 45861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4587a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 4588a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 4589a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 4590a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 4591a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 45921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4593a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 4594a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 4595a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 4596a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 4597a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 4598a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 4599a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4600a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 46011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4602a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 4603a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 4604ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 4605454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall UnresolvedLookupExpr *Old) { 4606f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName()); 4607f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4608f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 4609f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Sema::LookupOrdinaryName); 4610f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4611f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Transform all the decls. 4612f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 4613f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = Old->decls_end(); I != E; ++I) { 4614f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I)); 46159f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 46169f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 46179f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 46189f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 46199f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 46209f54ad4381370c6b771424b53d219e661d6d6706John McCall else 46219f54ad4381370c6b771424b53d219e661d6d6706John McCall return SemaRef.ExprError(); 46229f54ad4381370c6b771424b53d219e661d6d6706John McCall } 4623f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4624f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Expand using declarations. 4625f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (isa<UsingDecl>(InstD)) { 4626f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 4627f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 4628f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = UD->shadow_end(); I != E; ++I) 4629f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(*I); 4630f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall continue; 4631f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4632f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4633f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(InstD); 4634f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4635f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4636f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Resolve a kind, but don't do any further analysis. If it's 4637f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // ambiguous, the callee needs to deal with it. 4638f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.resolveKind(); 4639f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4640f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Rebuild the nested-name qualifier, if present. 4641f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 4642f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NestedNameSpecifier *Qualifier = 0; 4643f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Old->getQualifier()) { 4644f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 4645f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Old->getQualifierRange()); 4646f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Qualifier) 4647f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4648f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4649f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setScopeRep(Qualifier); 4650f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setRange(Old->getQualifierRange()); 4651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4652f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4653f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have no template arguments, it's a normal declaration name. 4654f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Old->hasExplicitTemplateArgs()) 4655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 4656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4657f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have template arguments, rebuild them, then rebuild the 4658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // templateid expression. 4659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 4660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 4661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentLoc Loc; 4662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc)) 4663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs.addArgument(Loc); 4665f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4666f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4667f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(), 4668f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs); 4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4673454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 46751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 46871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4697865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 4698454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall DependentScopeDeclRefExpr *E) { 4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4700f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4701f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 470681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 470781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 470881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 47091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4710f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!E->hasExplicitTemplateArgs()) { 4711f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!getDerived().AlwaysRebuild() && 4712f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NNS == E->getQualifier() && 4713f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name == E->getDeclName()) 4714f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.Owned(E->Retain()); 47151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4716f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4717f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 4718f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 4719f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /*TemplateArgs*/ 0); 4720f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 4721d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 4722d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4724d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4725d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4727d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 4728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4730f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4731f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 4732f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 4733f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall &TransArgs); 4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4738454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 47531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 47566eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (getDerived().DropCallArgument(*Arg)) { 47576eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor ArgumentChanged = true; 47586eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor break; 47596eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 47606eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 47741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47754411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 47764411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor Constructor, E->isElidable(), 4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 47825132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 47835132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that. 4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4786454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 47875132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 47935132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we 47945132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that. 4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 47985132655e4296b780672e9a96b46a740135073534Douglas Gregor CXXExprWithTemporaries *E) { 47995132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 4805454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXTemporaryObjectExpr *E) { 4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 48201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 48361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 48411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 4855454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXUnresolvedConstructExpr *E) { 4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 48801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4893865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 4894454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXDependentScopeMemberExpr *E) { 4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4896aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OwningExprResult Base(SemaRef, (Expr*) 0); 4897aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *OldBase; 4898aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 4899aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType ObjectType; 4900aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->isImplicitAccess()) { 4901aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = E->getBase(); 4902aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(OldBase); 4903aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 4904aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 49051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4906aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall // Start the member reference and compute the object's type. 4907aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Sema::TypeTy *ObjectTy = 0; 4908aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall E->getOperatorLoc(), 4910a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4911aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectTy); 4912aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 4913aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 4914aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 4915aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = QualType::getFromOpaquePtr(ObjectTy); 4916aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 4917aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 4918aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = 0; 4919aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(E->getBaseType()); 4920aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 4921aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 49221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49236cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 49246cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 4925c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 49266cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 49276cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 49286cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 49291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4930a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4931a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4932a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4933a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4934aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType, 4935aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall FirstQualifierInScope); 4936a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4937a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4938a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 49391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 4941dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 4942aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType); 494381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 494481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 49451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4946aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->hasExplicitTemplateArgs()) { 49473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 49483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 49493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 4950aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base.get() == OldBase && 4951aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType == E->getBaseType() && 49523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 49533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 49543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 49551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 49561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4957865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 4958aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 49593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 49603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 49613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 49623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 4963129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall FirstQualifierInScope, 49643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 49653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 4966129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /*TemplateArgs*/ 0); 49673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 49683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 4969d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 49703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4971d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4972d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 49733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 4974d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 49753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 49761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4977865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 4978aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 4979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4981a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4982a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 49833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 4984129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, 4985129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E->getMemberLoc(), 4986129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall &TransArgs); 4987129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 4988129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 4989129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived> 4990129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult 4991454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 4992129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform the base of the expression. 4993aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OwningExprResult Base(SemaRef, (Expr*) 0); 4994aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 4995aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Old->isImplicitAccess()) { 4996aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(Old->getBase()); 4997aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 4998aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 4999aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 5000aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 5001aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(Old->getBaseType()); 5002aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 5003129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5004129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NestedNameSpecifier *Qualifier = 0; 5005129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->getQualifier()) { 5006129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier 5007129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 5008129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getQualifierRange()); 5009129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Qualifier == 0) 5010129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return SemaRef.ExprError(); 5011129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5012129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5013129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(), 5014129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Sema::LookupOrdinaryName); 5015129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5016129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform all the decls. 5017129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 5018129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = Old->decls_end(); I != E; ++I) { 5019129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I)); 50209f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 50219f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 50229f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 50239f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 50249f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 50259f54ad4381370c6b771424b53d219e661d6d6706John McCall else 50269f54ad4381370c6b771424b53d219e661d6d6706John McCall return SemaRef.ExprError(); 50279f54ad4381370c6b771424b53d219e661d6d6706John McCall } 5028129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5029129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Expand using declarations. 5030129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (isa<UsingDecl>(InstD)) { 5031129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 5032129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 5033129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = UD->shadow_end(); I != E; ++I) 5034129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(*I); 5035129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall continue; 5036129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5037129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5038129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(InstD); 5039129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5040129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5041129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.resolveKind(); 5042129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5043129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentListInfo TransArgs; 5044129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->hasExplicitTemplateArgs()) { 5045129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setLAngleLoc(Old->getLAngleLoc()); 5046129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setRAngleLoc(Old->getRAngleLoc()); 5047129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 5048129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentLoc Loc; 5049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], 5050129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Loc)) 5051129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return SemaRef.ExprError(); 5052129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.addArgument(Loc); 5053129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5054129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5055c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 5056c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 5057c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 5058c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 5059c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 5060c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 5061129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5062129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return getDerived().RebuildUnresolvedMemberExpr(move(Base), 5063aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 5064129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getOperatorLoc(), 5065129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->isArrow(), 5066129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier, 5067129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getQualifierRange(), 5068c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope, 5069129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R, 5070129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall (Old->hasExplicitTemplateArgs() 5071129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall ? &TransArgs : 0)); 5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5076454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 50771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5082454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 5085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 50911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5100454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5108454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 51091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5114454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 51151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 5118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 5120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 51231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 51241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 51301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5135454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5143454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 5144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 515109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 5152454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ObjCImplicitSetterGetterRefExpr *E) { 5153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5160454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 5161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5168454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 5169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 51711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5176454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 5177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 5179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 5180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 51831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 5186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 51871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 51901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 51911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 5193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 5194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 51971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 51981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5199454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 5200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 52021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 52061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5207454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 5208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 52101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 52121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 5215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 521885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 521985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 522085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star, 5221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 522585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 522685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 522785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star, 5228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 52321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 523385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 523485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 523585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 523685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(), 523785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 52401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 52411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 524285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 524385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 524485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 52450953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 524685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 52501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 525185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType, 525285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 525385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil, 5254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseEntity()); 5255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 5259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 5260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 5262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 5263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 5265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 5266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 5267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 5268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 52691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 52711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 52721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 52731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 5274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 5275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 5276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 5277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 5278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 5279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 5280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 5281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 52821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 52841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 5285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 52861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 5287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 52901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 52911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 5292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 529485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 529585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 52961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 529785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 53011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 53021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 5303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 530485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 530585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 53061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 530785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 53111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 53121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 5313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 53171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 53231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 53241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 5325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 53291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 5336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 5337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 5338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 5339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 5343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 5344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 5346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 5347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 53481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 5349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 5351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 53551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 53561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 5357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 5360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 53641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 5365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 53661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 5367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 53681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 5369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 5370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 5371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 5372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 5376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 5377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5380ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 5381ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(D && "no decl found"); 5382ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (D->isInvalidDecl()) return QualType(); 5383ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5384ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeDecl *Ty; 5385ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (isa<UsingDecl>(D)) { 5386ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Using = cast<UsingDecl>(D); 5387ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(Using->isTypeName() && 5388ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-typename using"); 5389ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5390ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // A valid resolved using typename decl points to exactly one type decl. 5391ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(++Using->shadow_begin() == Using->shadow_end()); 5392ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 5393ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5394ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } else { 5395ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(isa<UnresolvedUsingTypenameDecl>(D) && 5396ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-using decl"); 5397ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<UnresolvedUsingTypenameDecl>(D); 5398ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 5399ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5400ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return SemaRef.Context.getTypeDeclType(Ty); 5401ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 5402ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5403ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> 5404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 5405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 5406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 5410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 5411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 5415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 5416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 5420833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 5421833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 5422d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 5423d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 5424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 54251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5426dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5427dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5428dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5429dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5430a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 5431c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 5432d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NamedDecl *FirstQualifierInScope) { 5433dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 5434dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 5435dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 5436dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 5437dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 54381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 5439495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 5440c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 5441c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 544246646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner false, false)); 5443dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5444dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5445dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5446dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5447dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5448dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5449dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 5450dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 5451dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5452dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5453dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5454dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5455dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5456dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5457dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 5458dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 5459dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 5460dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 5461a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here"); 5462dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 5463dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 5464dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 54651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5466dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 5467dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 5468dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 54691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5470d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 54711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5472d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5473d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5474d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 54751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 5476d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 5477d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5478d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5479d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 54801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5481d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 54823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 54833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 5484d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 5485d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 54861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 5487014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor UnqualifiedId Name; 5488014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation()); 54893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 54903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 54913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 5492014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name, 5493a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5494a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 54953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 5496d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 54971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5499ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5500ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5501ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 5502ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 5503ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor CXXScopeSpec SS; 5504ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 5505ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setScopeRep(Qualifier); 5506ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 5507ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SourceLocation SymbolLocations[3]; // FIXME: Bogus location information. 5508ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(), 5509ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Operator, SymbolLocations); 5510ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getSema().ActOnDependentTemplateName( 5511ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 5512ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS, 5513ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name, 5514a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5515a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 5516ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor .template getAsVal<TemplateName>(); 5517ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5518ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5519ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 55201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 5522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 5523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 5524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 5525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 5526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 5527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 5528ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts(); 5529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 55301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 5532f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 5533f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (!FirstExpr->getType()->isOverloadableType() && 5534f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl !SecondExpr->getType()->isOverloadableType()) 5535f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return getSema().CreateBuiltinArraySubscriptExpr(move(First), 5536ba13543329afac4a0d01304ec2ec4924d99306a6John McCall CalleeExpr->getLocStart(), 5537f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(Second), OpLoc); 55381a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 55391a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 55401a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc); 5541f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl } else if (SecondExpr == 0 || isPostIncDec) { 5542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 5543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 5544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 55451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 55471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 55511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 5554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 5555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 55561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 55601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 5563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 5564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 5569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5571ba13543329afac4a0d01304ec2ec4924d99306a6John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) { 5572ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 5573ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 5574ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 5575ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 5576ba13543329afac4a0d01304ec2ec4924d99306a6John McCall for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(), 5577ba13543329afac4a0d01304ec2ec4924d99306a6John McCall E = ULE->decls_end(); I != E; ++I) 5578ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Functions.insert(AnyFunctionDecl::getFromNamedDecl(*I)); 5579ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 5580ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Functions.insert(AnyFunctionDecl::getFromNamedDecl( 5581ba13543329afac4a0d01304ec2ec4924d99306a6John McCall cast<DeclRefExpr>(CalleeExpr)->getDecl())); 5582ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 55831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 5585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 5586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 55871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName OpName 5588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 5589644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs, 5590644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl Functions); 55911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 5593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 55941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 5596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 5597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5599f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 5600ba13543329afac4a0d01304ec2ec4924d99306a6John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(), 5601ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 5602ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(First), 5603ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(Second)); 5604f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 5605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 56061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 5607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 56081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 56121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 56151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 5616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 56171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 5619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 5621