TreeTransform.h revision 57fdc8a4382164955c7b30d09f4ce46fc7e67659
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. 194124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType TransformType(QualType T, QualType ObjectType = QualType()); 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. 204124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypeSourceInfo *TransformType(TypeSourceInfo *DI, 205124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType = QualType()); 206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transform the given type-with-location into a new 208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type, collecting location information in the given builder 209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// as necessary. 210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 211124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL, 212124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType = QualType()); 2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 214657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this routine transforms a statement by delegating to the 21743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// appropriate TransformXXXStmt function to transform a specific kind of 21843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// statement or the TransformExpr() function to transform an expression. 21943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to transform statements using some 22043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// other mechanism. 22143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 22243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \returns the transformed statement. 223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformStmt(Stmt *S); 2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 225657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 226657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 233454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult TransformExpr(Expr *E); 2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 239dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 2407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; } 24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 24243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Transform the definition of the given declaration. 24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, invokes TransformDecl() to transform the declaration. 24543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 2467c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 247aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor return getDerived().TransformDecl(Loc, D); 2487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor } 2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// \brief Transform the given declaration, which was the first part of a 2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// nested-name-specifier in a member access expression. 2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// This specific declaration transformation only applies to the first 2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// identifier in a nested-name-specifier of a member access expression, e.g., 2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// the \c T in \c x->T::member 2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// By default, invokes TransformDecl() to transform the declaration. 2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// Subclasses may override this function to provide alternate behavior. 2596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 2607c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 2616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor } 2626cd219879ffce00920189ec1dcea927a42602961Douglas Gregor 263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, transforms all of the types and declarations within the 266dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 267dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 269a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 270c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType = QualType(), 271c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 27681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 27781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 27881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 27981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName TransformDeclarationName(DeclarationName Name, 280dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 281dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType = QualType()); 2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 285d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and nested-name-specifiers that occur within the template name. 287d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 2883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName TransformTemplateName(TemplateName Name, 2893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType = QualType()); 2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this operation transforms the type, expression, or 2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// declaration stored within the template argument and constructs a 295670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 296670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// 298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// Returns true if there was an error. 299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output); 301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall void InventTemplateArgumentLoc(const TemplateArgument &Arg, 304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &ArgLoc); 305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 306a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall /// \brief Fakes up a TypeSourceInfo for a type. 307a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *InventTypeSourceInfo(QualType T) { 308a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return SemaRef.Context.getTrivialTypeSourceInfo(T, 309833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().getBaseLocation()); 310833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 314124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T, \ 315124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType = QualType()); 316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 31821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// \brief Transforms the parameters of a function type into the 31921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// given vectors. 32021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// 32121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// The result vectors should be kept in sync; null entries in the 32221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// variables vector are acceptable. 32321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// 32421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// Return true on error. 32521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL, 32621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVectorImpl<QualType> &PTypes, 32721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVectorImpl<ParmVarDecl*> &PVars); 32821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 32921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// \brief Transforms a single function-type parameter. Return null 33021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// on error. 33121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm); 33221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 333124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL, 334124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType); 33585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 336dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType 337dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TransformTemplateSpecializationType(const TemplateSpecializationType *T, 338dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType); 339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 34043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 341d8383d45e41ba2316610e5d638d2872e37b67cfbZhongxing Xu OwningExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 34443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 346454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult Transform##Node(Node *E); 347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 36085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \brief Build a new reference type given the type it references. 363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// By default, performs semantic analysis when building the 36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// reference type. Subclasses may override this routine to provide 36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// different behavior. 367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \param LValue whether the type was written with an lvalue sigil 36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// or an rvalue sigil. 37085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildReferenceType(QualType ReferentType, 37185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool LValue, 37285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 37985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 38085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 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 /// Also by default, all of the other Rebuild*Array 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 40485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 40585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 41485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 41585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 44482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 44582287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson bool IsAltiVec, bool IsPixel); 4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 476ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// \brief Rebuild an unresolved typename type, given the decl that 477ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// the UnresolvedUsingTypenameDecl was transformed to. 478ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType RebuildUnresolvedUsingType(Decl *D); 479ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4947da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4957da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4967da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 4977da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 4987da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 4991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 523833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateLoc, 524d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args); 5251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 5331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5374033642464e8ba0982f88f34cffad808d247b393Douglas Gregor /// By default, builds a new DependentNameType type from the 5384033642464e8ba0982f88f34cffad808d247b393Douglas Gregor /// nested-name-specifier 5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5414a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 5424a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, QualType T) { 543ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor if (NNS->isDependent()) { 5444033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // If the name is still dependent, just build a new dependent name type. 545ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor CXXScopeSpec SS; 546ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor SS.setScopeRep(NNS); 547ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor if (!SemaRef.computeDeclContext(SS)) 5484a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor return SemaRef.Context.getDependentNameType(Keyword, NNS, 549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 550ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor } 5514033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 5524a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor // FIXME: Handle elaborated-type-specifiers separately. 553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 5591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5614a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 5624a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NestedNameSpecifier *NNS, 5634a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor const IdentifierInfo *Id, 5644a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor SourceRange SR) { 5654033642464e8ba0982f88f34cffad808d247b393Douglas Gregor CXXScopeSpec SS; 5664033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SS.setScopeRep(NNS); 5674033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 5684033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (NNS->isDependent()) { 5694033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // If the name is still dependent, just build a new dependent name type. 5704033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!SemaRef.computeDeclContext(SS)) 5714033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return SemaRef.Context.getDependentNameType(Keyword, NNS, Id); 5724033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 5734033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 5744033642464e8ba0982f88f34cffad808d247b393Douglas Gregor TagDecl::TagKind Kind = TagDecl::TK_enum; 5754033642464e8ba0982f88f34cffad808d247b393Douglas Gregor switch (Keyword) { 5764033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case ETK_None: 577107de90451b7f7a7749380a9d017ff1bafb6b407Douglas Gregor // Fall through. 5784033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case ETK_Typename: 579107de90451b7f7a7749380a9d017ff1bafb6b407Douglas Gregor return SemaRef.CheckTypenameType(Keyword, NNS, *Id, SR); 5804033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 5814033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case ETK_Class: Kind = TagDecl::TK_class; break; 5824033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case ETK_Struct: Kind = TagDecl::TK_struct; break; 5834033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case ETK_Union: Kind = TagDecl::TK_union; break; 5844033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case ETK_Enum: Kind = TagDecl::TK_enum; break; 5854033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 5864033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 5874033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // We had a dependent elaborated-type-specifier that as been transformed 5884033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // into a non-dependent elaborated-type-specifier. Find the tag we're 5894033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // referring to. 5904033642464e8ba0982f88f34cffad808d247b393Douglas Gregor LookupResult Result(SemaRef, Id, SR.getEnd(), Sema::LookupTagName); 5914033642464e8ba0982f88f34cffad808d247b393Douglas Gregor DeclContext *DC = SemaRef.computeDeclContext(SS, false); 5924033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!DC) 5934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 5944033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 5954033642464e8ba0982f88f34cffad808d247b393Douglas Gregor TagDecl *Tag = 0; 5964033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SemaRef.LookupQualifiedName(Result, DC); 5974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor switch (Result.getResultKind()) { 5984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::NotFound: 5994033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::NotFoundInCurrentInstantiation: 6004033642464e8ba0982f88f34cffad808d247b393Douglas Gregor break; 6014033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 6024033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::Found: 6034033642464e8ba0982f88f34cffad808d247b393Douglas Gregor Tag = Result.getAsSingle<TagDecl>(); 6044033642464e8ba0982f88f34cffad808d247b393Douglas Gregor break; 6054033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 6064033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::FoundOverloaded: 6074033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::FoundUnresolvedValue: 6084033642464e8ba0982f88f34cffad808d247b393Douglas Gregor llvm_unreachable("Tag lookup cannot find non-tags"); 6094033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 6104033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 6114033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::Ambiguous: 6124033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // Let the LookupResult structure handle ambiguities. 6134033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 6144033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 6154033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 6164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!Tag) { 6171eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor // FIXME: Would be nice to highlight just the source range. 6184033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SemaRef.Diag(SR.getEnd(), diag::err_not_tag_in_scope) 6191eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor << Kind << Id << DC; 6204033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 6214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 6224033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 6234033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // FIXME: Terrible location information 6244033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, SR.getEnd(), *Id)) { 6254033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SemaRef.Diag(SR.getBegin(), diag::err_use_with_wrong_tag) << Id; 6264033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 6274033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 6284033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 6294033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 6304033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // Build the elaborated-type-specifier type. 6314033642464e8ba0982f88f34cffad808d247b393Douglas Gregor QualType T = SemaRef.Context.getTypeDeclType(Tag); 6324033642464e8ba0982f88f34cffad808d247b393Douglas Gregor T = SemaRef.Context.getQualifiedNameType(NNS, T); 6334033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return SemaRef.Context.getElaboratedType(T, Kind); 634dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 6351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 636dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 637dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 638dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 639dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 640dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 641dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 642dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 643dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 644a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 645c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 646c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 647dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 648dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 649dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 650dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 651dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 652dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 653dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 654dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 655dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 656dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 657dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 658dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 659dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 660dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 661dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 662dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 663dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 664dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 665dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 666dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 667edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor QualType T); 668d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 669d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 670d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 671d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 672d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 673d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 674d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 675d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 676d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 677d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 678d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 679d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 680d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 681d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 682d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 683d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 684d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 685d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 686d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 6873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 6883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 690ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// \brief Build a new template name given a nested name specifier and the 691ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// overloaded operator name that is referred to as a template. 692ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// 693ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// By default, performs semantic analysis to determine whether the name can 694ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 695ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// template name. Subclasses may override this routine to provide different 696ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// behavior. 697ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 698ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 699ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType); 700ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 7221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default 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. 7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 76299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, StmtArg Then, 76399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor SourceLocation ElseLoc, StmtArg Else) { 76499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar), 76599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), ElseLoc, move(Else)); 76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 77299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(Sema::FullExprArg Cond, 77399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar) { 77499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnStartOfSwitchStmt(Cond, DeclPtrTy::make(CondVar)); 77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 79399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, 79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 79599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, DeclPtrTy::make(CondVar), 79699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 80043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 80343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 8081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 81143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 81243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 81343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 81443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 81543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 81743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 81899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor StmtArg Init, Sema::FullExprArg Cond, 81999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, Sema::FullExprArg Inc, 82043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 82199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond, 82299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor DeclPtrTy::make(CondVar), 82399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Inc, RParenLoc, move(Body)); 82443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 82643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 82743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 82843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 82943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 83043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 83143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 83243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 83343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 83443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 83643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 83743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 83943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 84043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 84143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 84243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 84343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 84443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 84643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 84743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 84843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 84943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 85043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 85143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 85343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 85443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 85643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 85743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 85843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 85943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 86043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 86243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 86343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 86443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 86543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 86643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 86743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 86843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 870703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// \brief Build a new inline asm statement. 871703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// 872703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// By default, performs semantic analysis to build the new statement. 873703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// Subclasses may override this routine to provide different behavior. 874703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc, 875703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool IsSimple, 876703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool IsVolatile, 877703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson unsigned NumOutputs, 878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson unsigned NumInputs, 879ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson IdentifierInfo **Names, 880703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Constraints, 881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Exprs, 882703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprArg AsmString, 883703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Clobbers, 884703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson SourceLocation RParenLoc, 885703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool MSAsm) { 886703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 887703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson NumInputs, Names, move(Constraints), 888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move(Exprs), move(AsmString), move(Clobbers), 889703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson RParenLoc, MSAsm); 890703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 8914dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 8924dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// \brief Build a new Objective-C @try statement. 8934dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// 8944dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// By default, performs semantic analysis to build the new statement. 8954dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 8964dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 8974dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor StmtArg TryBody, 8988f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor MultiStmtArg CatchStmts, 8994dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor StmtArg Finally) { 9008f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(CatchStmts), 9014dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor move(Finally)); 9024dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 9034dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 904be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// \brief Rebuild an Objective-C exception declaration. 905be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// 906be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// By default, performs semantic analysis to build the new declaration. 907be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 908be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 909be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TypeSourceInfo *TInfo, QualType T) { 910be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return getSema().BuildObjCExceptionDecl(TInfo, T, 911be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor ExceptionDecl->getIdentifier(), 912be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor ExceptionDecl->getLocation()); 913be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 914be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor 915be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// \brief Build a new Objective-C @catch statement. 916be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// 917be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// By default, performs semantic analysis to build the new statement. 918be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 919be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor OwningStmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 920be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor SourceLocation RParenLoc, 921be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *Var, 922be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor StmtArg Body) { 923be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 924be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor Sema::DeclPtrTy::make(Var), 925be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor move(Body)); 926be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 927be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor 9284dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// \brief Build a new Objective-C @finally statement. 9294dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// 9304dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// By default, performs semantic analysis to build the new statement. 9314dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor OwningStmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 9334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor StmtArg Body) { 9344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return getSema().ActOnObjCAtFinallyStmt(AtLoc, move(Body)); 9354dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 936703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 9378fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// \brief Build a new Objective-C @throw statement. 938d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// 939d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// By default, performs semantic analysis to build the new statement. 940d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// Subclasses may override this routine to provide different behavior. 941d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor OwningStmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 942d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor ExprArg Operand) { 943d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor return getSema().BuildObjCAtThrowStmt(AtLoc, move(Operand)); 944d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor } 945d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor 9468fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// \brief Build a new Objective-C @synchronized statement. 9478fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// 9488fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// By default, performs semantic analysis to build the new statement. 9498fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// Subclasses may override this routine to provide different behavior. 9508fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor OwningStmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 9518fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor ExprArg Object, 9528fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor StmtArg Body) { 9538fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, move(Object), 9548fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor move(Body)); 9558fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor } 956c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor 957c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// \brief Build a new Objective-C fast enumeration statement. 958c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// 959c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// By default, performs semantic analysis to build the new statement. 960c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 961c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor OwningStmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 962c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor SourceLocation LParenLoc, 963c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor StmtArg Element, 964c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor ExprArg Collection, 965c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor SourceLocation RParenLoc, 966c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor StmtArg Body) { 967c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc, 968c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor move(Element), 969c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor move(Collection), 970c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor RParenLoc, 971c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor move(Body)); 972c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor } 9738fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor 97443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 97543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 97643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 97743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 9781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 979a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *Declarator, 98043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 98143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 98243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 9831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 98443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 98543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 98643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 98743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 98843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 98943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 99043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 99143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 99243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 99343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 99443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 9951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 99643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 99743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 9981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 99943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 100043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 100143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 100243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 100343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 100443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 100543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1013f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 1014f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 1015f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL) { 1016f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 1017f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 1018f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1019f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1020f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// \brief Build a new expression that references a declaration. 1021f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// 1022f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// By default, performs semantic analysis to build the new expression. 1023f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Subclasses may override this routine to provide different behavior. 1024a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier, 1025a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 1026dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *VD, SourceLocation Loc, 1027dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo *TemplateArgs) { 1028a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 1029a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setScopeRep(Qualifier); 1030a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setRange(QualifierRange); 1031dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 1032dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: loses template args. 1033dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 1034dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return getSema().BuildDeclarationNameExpr(SS, Loc, VD); 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 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. 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1046a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 10471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1048a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1049a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1050a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 1051a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 1052a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 1053a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor NestedNameSpecifier *Qualifier, 105426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceRange QualifierRange, 105526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeType, 105626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation CCLoc, 1057fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 1058a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed); 10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 10611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 10676ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr)); 1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1074a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo, 10755ab75172051a6d2ea71a80a79e81c65519fd3462John McCall SourceLocation OpLoc, 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 1077a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R); 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 10801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 10821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 11011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 11061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 112883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 112983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 113083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 1131f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member, 11326bb8017bb9e828d118e15e59d71c66bba323c364John McCall NamedDecl *FoundDecl, 1133d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *ExplicitTemplateArgs, 11348a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor NamedDecl *FirstQualifierInScope) { 1135d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 1136d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 1137d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113983a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor Expr *BaseExpr = Base.takeAs<Expr>(); 11406bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (getSema().PerformObjectMemberConversion(BaseExpr, Qualifier, 11416bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl, Member)) 114283a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor return getSema().ExprError(); 11438aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor 11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 114583a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor new (getSema().Context) MemberExpr(BaseExpr, isArrow, 1146d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 1147d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 1148d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 1149d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 11501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 115183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 115283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 115383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 115483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 115583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 115683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 1157aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType = ((Expr*) Base.get())->getType(); 1158aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 11596bb8017bb9e828d118e15e59d71c66bba323c364John McCall // FIXME: this involves duplicating earlier analysis in a lot of 11606bb8017bb9e828d118e15e59d71c66bba323c364John McCall // cases; we should avoid this when possible. 1161c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall LookupResult R(getSema(), Member->getDeclName(), MemberLoc, 1162c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall Sema::LookupMemberName); 11636bb8017bb9e828d118e15e59d71c66bba323c364John McCall R.addDecl(FoundDecl); 1164c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R.resolveKind(); 1165c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 1166aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 1167aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OpLoc, isArrow, 1168129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 1169c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, ExplicitTemplateArgs); 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 11731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 11796ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, 11806ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor LHS.takeAs<Expr>(), RHS.takeAs<Expr>()); 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 11921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 11971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 12009d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 12019d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 1204b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 1205b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall move(SubExpr)); 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 12091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 121342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *TInfo, 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 121642f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 121742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall move(Init)); 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 12211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 12241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 1228aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 1229129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall CXXScopeSpec SS; 1230aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType = ((Expr*) Base.get())->getType(); 1231aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 1232129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OpLoc, /*IsArrow*/ false, 1233129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, /*FirstQualifierInScope*/ 0, 12342d1c21414199a7452f122598189363a3922605b1Douglas Gregor DeclarationName(&Accessor), 1235129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall AccessorLoc, 1236129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /* TemplateArgs */ 0); 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 12401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1245e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor SourceLocation RBraceLoc, 1246e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor QualType ResultTy) { 1247e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor OwningExprResult Result 1248e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1249e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor if (Result.isInvalid() || ResultTy->isDependentType()) 1250e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1251e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor 1252e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // Patch in the result type we were given, which may have been computed 1253e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // when the initial InitListExpr was built. 1254e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1255e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor ILE->setType(ResultTy); 1256e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 12601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 12731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 12791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 12881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 12931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 12981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 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 RebuildParenListExpr(SourceLocation LParenLoc, 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1304f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc, 1305f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian move(SubExprs)); 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 13101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 13591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 13671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 13721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 13779d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 13849d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 13851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 13899d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 13901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 13921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 13949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 13951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 13981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 14009d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 14011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 14031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 14189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1423c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 1424c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1425c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1426c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 14359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1440c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 1441c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1442c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1443c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 14529d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1457c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1458c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1459c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1460c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 14699d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1474c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 1475c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1476c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1477c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 14859d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 148988650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 14919d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 149388650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 14941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 150257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 150357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor SourceLocation TypeidLoc, 150457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *Operand, 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 150657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 150757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor RParenLoc); 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 151457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 151557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor SourceLocation TypeidLoc, 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 151857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, move(Operand), 151957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor RParenLoc); 15201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 15211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 15251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 15271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1528828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor QualType ThisType, 1529828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor bool isImplicit) { 1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1531828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, 1532828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor isImplicit)); 1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1548036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 1549036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param) { 1550036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc, 1551036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor Param)); 1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 15621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 15631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 15641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 15771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 15851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 16201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1629865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS, 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1633f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall const TemplateArgumentListInfo *TemplateArgs) { 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1637f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1638f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (TemplateArgs) 1639f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location, 1640f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall *TemplateArgs); 1641f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1642f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location); 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1649f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 1650f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 1651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL, 1652d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 1653f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs); 1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 16614411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor SourceLocation Loc, 1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 16654411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef); 16664411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, 16674411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ConvertedArgs)) 16684411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().ExprError(); 16694411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor 16704411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 16714411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor move_arg(ConvertedArgs)); 1672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 17101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1715865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE, 1716aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1719a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1720a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1721129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NamedDecl *FirstQualifierInScope, 1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1723c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1724129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 1725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1726a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1727a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 17281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1729aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, 1730aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1731129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 1732129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, MemberLoc, TemplateArgs); 1733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1735129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Build a new member reference expression. 17363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 17373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 17383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1739129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE, 1740aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1741129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 1742129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool IsArrow, 1743129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NestedNameSpecifier *Qualifier, 1744129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceRange QualifierRange, 1745c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope, 1746129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult &R, 1747129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 17483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 17493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 17503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1752aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, 1753aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1754c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall SS, FirstQualifierInScope, 1755c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, TemplateArgs); 17563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 17571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 176381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodeTypeInfo, 1764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 176581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, 1766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 176992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /// \brief Build a new Objective-C class message. 177092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor OwningExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 177192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Selector Sel, 177292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ObjCMethodDecl *Method, 177392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor SourceLocation LBracLoc, 177492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor MultiExprArg Args, 177592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor SourceLocation RBracLoc) { 177692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.BuildClassMessage(ReceiverTypeInfo, 177792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverTypeInfo->getType(), 177892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /*SuperLoc=*/SourceLocation(), 1779f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Sel, Method, LBracLoc, RBracLoc, 178092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move(Args)); 178192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 178292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 178392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /// \brief Build a new Objective-C instance message. 178492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor OwningExprResult RebuildObjCMessageExpr(ExprArg Receiver, 178592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Selector Sel, 178692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ObjCMethodDecl *Method, 178792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor SourceLocation LBracLoc, 178892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor MultiExprArg Args, 178992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor SourceLocation RBracLoc) { 179092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor QualType ReceiverType = static_cast<Expr *>(Receiver.get())->getType(); 179192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.BuildInstanceMessage(move(Receiver), 179292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverType, 179392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /*SuperLoc=*/SourceLocation(), 1794f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Sel, Method, LBracLoc, RBracLoc, 179592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move(Args)); 179692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 179792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 1798f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// \brief Build a new Objective-C ivar reference expression. 1799f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// 1800f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// By default, performs semantic analysis to build the new expression. 1801f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1802f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor OwningExprResult RebuildObjCIvarRefExpr(ExprArg BaseArg, ObjCIvarDecl *Ivar, 1803f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor SourceLocation IvarLoc, 1804f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor bool IsArrow, bool IsFreeIvar) { 1805f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // FIXME: We lose track of the IsFreeIvar bit. 1806f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor CXXScopeSpec SS; 1807f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Expr *Base = BaseArg.takeAs<Expr>(); 1808f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc, 1809f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Sema::LookupMemberName); 1810f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 1811f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FIME:*/IvarLoc, 1812f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor SS, DeclPtrTy()); 1813f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.isInvalid()) 1814f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return getSema().ExprError(); 1815f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 1816f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.get()) 1817f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return move(Result); 1818f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 1819f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return getSema().BuildMemberReferenceExpr(getSema().Owned(Base), 1820f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base->getType(), 1821f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FIXME:*/IvarLoc, IsArrow, SS, 1822f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FirstQualifierInScope=*/0, 1823f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor R, 1824f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*TemplateArgs=*/0); 1825f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor } 1826e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 1827e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// \brief Build a new Objective-C property reference expression. 1828e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// 1829e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1830e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1831e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor OwningExprResult RebuildObjCPropertyRefExpr(ExprArg BaseArg, 1832e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor ObjCPropertyDecl *Property, 1833e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor SourceLocation PropertyLoc) { 1834e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor CXXScopeSpec SS; 1835e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Expr *Base = BaseArg.takeAs<Expr>(); 1836e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor LookupResult R(getSema(), Property->getDeclName(), PropertyLoc, 1837e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Sema::LookupMemberName); 1838e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor bool IsArrow = false; 1839e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 1840e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*FIME:*/PropertyLoc, 1841e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor SS, DeclPtrTy()); 1842e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Result.isInvalid()) 1843e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor return getSema().ExprError(); 1844e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 1845e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Result.get()) 1846e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor return move(Result); 1847e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 1848e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor return getSema().BuildMemberReferenceExpr(getSema().Owned(Base), 1849e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Base->getType(), 1850e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*FIXME:*/PropertyLoc, IsArrow, 1851e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor SS, 1852e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*FirstQualifierInScope=*/0, 1853e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor R, 1854e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*TemplateArgs=*/0); 1855e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor } 1856e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 18579cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// \brief Build a new Objective-C implicit setter/getter reference 18589cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// expression. 18599cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// 18609cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// By default, performs semantic analysis to build the new expression. 18619cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// Subclasses may override this routine to provide different behavior. 18629cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor OwningExprResult RebuildObjCImplicitSetterGetterRefExpr( 18639cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor ObjCMethodDecl *Getter, 18649cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor QualType T, 18659cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor ObjCMethodDecl *Setter, 18669cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor SourceLocation NameLoc, 18679cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor ExprArg Base) { 18689cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor // Since these expressions can only be value-dependent, we do not need to 18699cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor // perform semantic analysis again. 18709cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor return getSema().Owned( 18719cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T, 18729cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor Setter, 18739cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor NameLoc, 18749cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor Base.takeAs<Expr>())); 18759cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor } 18769cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor 1877f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// \brief Build a new Objective-C "isa" expression. 1878f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// 1879f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// By default, performs semantic analysis to build the new expression. 1880f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1881f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor OwningExprResult RebuildObjCIsaExpr(ExprArg BaseArg, SourceLocation IsaLoc, 1882f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor bool IsArrow) { 1883f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor CXXScopeSpec SS; 1884f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Expr *Base = BaseArg.takeAs<Expr>(); 1885f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc, 1886f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Sema::LookupMemberName); 1887f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 1888f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FIME:*/IsaLoc, 1889f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor SS, DeclPtrTy()); 1890f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.isInvalid()) 1891f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return getSema().ExprError(); 1892f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 1893f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.get()) 1894f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return move(Result); 1895f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 1896f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return getSema().BuildMemberReferenceExpr(getSema().Owned(Base), 1897f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base->getType(), 1898f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FIXME:*/IsaLoc, IsArrow, SS, 1899f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FirstQualifierInScope=*/0, 1900f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor R, 1901f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*TemplateArgs=*/0); 1902f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor } 1903f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 1904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 19121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 19171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 19201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 19220da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor BuiltinLoc); 1923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 19241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 19331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 19381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 19401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 194443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 194543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 194643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 194743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 19481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 194943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 195043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 19511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 195243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 195343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 195443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 195543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 195643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 19571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 195843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 195943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 196009cc141c89a5e9f305c17d7a88298647df16ceddJohn McCall#define ABSTRACT_EXPR(Node, Parent) 196143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 196243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 196343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 196443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 196543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 196643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 19671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19685ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson return getSema().ActOnExprStmt(getSema().MakeFullExpr(E)); 196943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 19701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 19711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 197243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 197343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 19741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1976670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1977454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 1978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 198409cc141c89a5e9f305c17d7a88298647df16ceddJohn McCall#define ABSTRACT_EXPR(Node, Parent) 1985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1986454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 19881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 19891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1991657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1992657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1993657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1994dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1995dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1996a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1997c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1998c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 19990979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 20000979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 20011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 200243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 2003dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 2004dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 20051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 2006c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 2007c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 2008dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 2009dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 20101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 2012c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 2013a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 2014c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 2015dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 20161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2017dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 2018dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 20191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 2020a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 2021a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 2022a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 2023dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 20241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 2026a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 2027c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 2028c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 20291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2030dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 2032dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 20337c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Range.getBegin(), 20347c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NNS->getAsNamespace())); 20351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 2036dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 2037dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 2038dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2040dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 2041dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2043dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 2044dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 2045dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 2046dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 20471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2048dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 2049dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 2050fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 2051124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0), 2052124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 2053d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 2054d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2056dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 2057dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 2058dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 2059dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 20601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 2063edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor T); 2064dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 2065dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2067dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 20681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 2069dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 2070dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 2071dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 20721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 207381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 2074dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 2075dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 207681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 207781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 207881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 207981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 208081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 208181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 208281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 208381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 208481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 20853e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 208681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 208781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 20881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 208981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 209081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 209181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 209281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 2093124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType T = getDerived().TransformType(Name.getCXXNameType(), 2094124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 209581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 209681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 20971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 209881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 210081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 210181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 21021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 21031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 210481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 210581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 210681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 210781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 21081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 21093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 21103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 21117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor SourceLocation Loc = getDerived().getBaseLocation(); 21127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor 2113d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 21141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 2115d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 2116124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation()), 2117124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 2118d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 2119d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 21201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2121d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 21221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 21237c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template)); 2124d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 2125d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 21261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2127d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2128d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 2129d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 2130d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 21311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2132d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 2133d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 2134d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 21351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2136f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they make it into the AST. 2137f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded template name survived to here"); 2138d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 21391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2140d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 21411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 2142d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 2143124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation()), 2144124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 21453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 2146d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 21471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2148d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2149dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 2150dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 2151d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 21521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2153ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 2154ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(), 2155ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 2156ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 2157ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, DTN->getOperator(), 2158ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 2159d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 21601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2161d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 21637c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template)); 2164d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 2165d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 21661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2167d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2168d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 2169d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 21701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2171d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 2172d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 21731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2174f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they reach the AST. 2175f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded function decl survived to here"); 2176f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return TemplateName(); 2177d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 2178d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 2179d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 2180833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 2181833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 2182833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 2183833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 2184670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 2185670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 21869f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("null template argument in TreeTransform"); 2187833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2188833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2189833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 2190833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 2191a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 2192833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2193833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2194833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2195788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 2196788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(Arg, SourceRange(), Loc); 2197788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor break; 2198788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 2199833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 2200833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 2201833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2202833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2203833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 2204670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 2205833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 2206828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 2207833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2208833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2211833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2212833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 2213833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 2214833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 2215833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 2216833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 2217833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 2218833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 2219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 2220833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 22211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2222670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 2223a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = Input.getTypeSourceInfo(); 2224833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 2225a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 2226833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2227833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 2228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 2229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 2231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2232670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 22331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2234670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 2235833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 2236972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 2237972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 2238972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 2239788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), Name); 22407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl()); 2241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 2242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2243828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 2244828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 2245828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 2246828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Action::Unevaluated); 2247828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr); 2248828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (E.isInvalid()) 2249828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = NULL; 2250828bff2079b6a91ecd7ed5b842c59527d7682789John McCall else { 2251828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = E.takeAs<Expr>(); 2252828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr->Retain(); 2253828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 2254828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 2255828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2256828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 2257833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2258670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 22591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2260788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: { 2261788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName()); 2262788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateName Template 2263788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor = getDerived().TransformTemplateName(Arg.getAsTemplate()); 2264788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor if (Template.isNull()) 2265788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return true; 2266788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 2267788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(TemplateArgument(Template), 2268788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateQualifierRange(), 2269788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateNameLoc()); 2270788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return false; 2271788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor } 2272788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 2273670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 2274670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 22751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 2276670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 22771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2278833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 2279833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 2280833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2281833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Sema::OwningExprResult E 2282833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 2283833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 2284833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2285833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *ETaken = E.takeAs<Expr>(); 2286828bff2079b6a91ecd7ed5b842c59527d7682789John McCall ETaken->Retain(); 2287833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken); 2288833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2289670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 22901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2291670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 2292670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 2293670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 22941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 2295670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 2296670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 22971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2301828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2302828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2303828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2304828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2307828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2308670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2309670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 23101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 2311670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 2312828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Result, Input.getLocInfo()); 2313833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2314670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2315670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 23161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2317670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2319670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2320670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2326124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T, 2327124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 23301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2332a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2333a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T); 23344802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2336124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType); 23371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 23401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2345124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI, 2346124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 23491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 23511bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 2353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 23541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2355124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType Result = getDerived().TransformType(TLB, TL, ObjectType); 2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 23581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2359a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TLB.getTypeSourceInfo(SemaRef.Context, Result); 2360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2363a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2364124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T, 2365124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 2370124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \ 2371124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 23759f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("unhandled type loc!"); 2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 23841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 23851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 2387124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualifiedTypeLoc T, 2388124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2389a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers Quals = T.getType().getLocalQualifiers(); 2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2391124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(), 2392124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 24011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2420124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor BuiltinTypeLoc T, 2421124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2422ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 2423ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.setBuiltinLoc(T.getBuiltinLoc()); 2424ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor if (T.needsExtraLocalData()) 2425ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 2426ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return T.getType(); 2427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 24291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2431124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ComplexTypeLoc T, 2432124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 24361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2439124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor PointerTypeLoc TL, 2440124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 244192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor QualType PointeeType 244292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformType(TLB, TL.getPointeeLoc()); 244392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (PointeeType.isNull()) 244492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return QualType(); 244592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 244692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor QualType Result = TL.getType(); 244792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (PointeeType->isObjCInterfaceType()) { 244892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // A dependent pointer type 'T *' has is being transformed such 244992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // that an Objective-C class type is being replaced for 'T'. The 245092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // resulting pointer type is an ObjCObjectPointerType, not a 245192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // PointerType. 245292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor const ObjCInterfaceType *IFace = PointeeType->getAs<ObjCInterfaceType>(); 245392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Result = SemaRef.Context.getObjCObjectPointerType(PointeeType, 245492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor const_cast<ObjCProtocolDecl **>( 245592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor IFace->qual_begin()), 245692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor IFace->getNumProtocols()); 245792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 245892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 245992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor NewT.setStarLoc(TL.getSigilLoc()); 246092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor NewT.setHasProtocolsAsWritten(false); 246192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor NewT.setLAngleLoc(SourceLocation()); 246292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor NewT.setRAngleLoc(SourceLocation()); 246392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor NewT.setHasBaseTypeAsWritten(true); 246492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return Result; 246592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 246692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 246792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (getDerived().AlwaysRebuild() || 246892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor PointeeType != TL.getPointeeLoc().getType()) { 246992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 247092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Result.isNull()) 247192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return QualType(); 247292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 247392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 247492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 247592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor NewT.setSigilLoc(TL.getSigilLoc()); 247692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return Result; 2477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 24791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 24801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2482124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor BlockPointerTypeLoc TL, 2483124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2484db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor QualType PointeeType 2485db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2486db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor if (PointeeType.isNull()) 2487db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor return QualType(); 2488db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor 2489db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor QualType Result = TL.getType(); 2490db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor if (getDerived().AlwaysRebuild() || 2491db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor PointeeType != TL.getPointeeLoc().getType()) { 2492db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor Result = getDerived().RebuildBlockPointerType(PointeeType, 2493db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor TL.getSigilLoc()); 2494db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor if (Result.isNull()) 2495db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor return QualType(); 2496db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor } 2497db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor 249839968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 2499db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor NewT.setSigilLoc(TL.getSigilLoc()); 2500db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor return Result; 2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 25021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 250385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 250485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 250585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 250685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 250785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 250885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 250985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 2510124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ReferenceTypeLoc TL, 2511124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 251285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 251385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 251485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 251585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 251685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 251785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 251885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 251985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 252085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 252185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 252285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 252385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 252485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 252585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 252685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 252785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 252885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 252985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 253085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 253185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 253285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 253385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 253485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 253585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 253685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 253785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 253885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 253985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2543124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor LValueReferenceTypeLoc TL, 2544124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2545124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor return TransformReferenceType(TLB, TL, ObjectType); 2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 25471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2551124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor RValueReferenceTypeLoc TL, 2552124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2553124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor return TransformReferenceType(TLB, TL, ObjectType); 2554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 25571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2559124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor MemberPointerTypeLoc TL, 2560124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 257785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 257885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 25891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 25901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2592124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ConstantArrayTypeLoc TL, 2593124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 260585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 260685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 26141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2628124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor IncompleteArrayTypeLoc TL, 2629124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 264085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 264185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2657124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor VariableArrayTypeLoc TL, 2658124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2664670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2665670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2666670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2675a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 268285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 26921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2694577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2699124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor DependentSizedArrayTypeLoc TL, 2700124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2706670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2707670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 27081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2710a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2715a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 272485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2727577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 27291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2743124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor DependentSizedExtVectorTypeLoc TL, 2744124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2748577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2749577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2752670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2753670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2754670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2755577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2756577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2757577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2761eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2762eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2782577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2786124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor VectorTypeLoc TL, 2787124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2789577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2790577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2791577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2792577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2794a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 279682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 279782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson T->isAltiVec(), T->isPixel()); 2798a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2800a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2801a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2802a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2803a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 28041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2805a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2810124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ExtVectorTypeLoc TL, 2811124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2812a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2813577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2814577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2815577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2817a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2818a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2819a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2820a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2821a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2822a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2823a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2824a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2825a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2826a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2828a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 28291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2830a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2832577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 28331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 283421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl * 283521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) { 283621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 283721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *NewDI = getDerived().TransformType(OldDI); 283821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewDI) 283921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return 0; 284021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 284121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (NewDI == OldDI) 284221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return OldParm; 284321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall else 284421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return ParmVarDecl::Create(SemaRef.Context, 284521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getDeclContext(), 284621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getLocation(), 284721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getIdentifier(), 284821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewDI->getType(), 284921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewDI, 285021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getStorageClass(), 285116573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor OldParm->getStorageClassAsWritten(), 285221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /* DefArg */ NULL); 285321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall} 285421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 285521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived> 285621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>:: 285721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TransformFunctionTypeParams(FunctionProtoTypeLoc TL, 285821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVectorImpl<QualType> &PTypes, 285921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVectorImpl<ParmVarDecl*> &PVars) { 2860a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 28611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2862a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2863a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2864a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2865a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2866a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2867a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2868a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 286921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewParm = getDerived().TransformFunctionTypeParam(OldParm); 287021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewParm) 287121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return true; 2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2874a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2878a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2879a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2880a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2881a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 288221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return true; 2883a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 28841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 288521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall PTypes.push_back(NewType); 288621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall PVars.push_back(NewParm); 2887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 28881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 288921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return false; 289021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall} 289121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 289221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived> 289321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType 289421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 289521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall FunctionProtoTypeLoc TL, 289621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall QualType ObjectType) { 289721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall FunctionProtoType *T = TL.getTypePtr(); 289821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 289921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (ResultType.isNull()) 290021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return QualType(); 290121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 290221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall // Transform the parameters. 290321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVector<QualType, 4> ParamTypes; 290421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 290521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls)) 290621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return QualType(); 290721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 2908a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2909a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2910a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2911a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2913a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2914a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2915a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2916a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2917a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2918a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2919a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 29201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2921a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2922a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2923a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2924a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2925a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2926a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2928577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2933124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor FunctionNoProtoTypeLoc TL, 2934124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2939a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2942a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2950577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2952ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType 2953ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 2954124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor UnresolvedUsingTypeLoc TL, 2955124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2956ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UnresolvedUsingType *T = TL.getTypePtr(); 29577c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 2958ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (!D) 2959ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 2960ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2961ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType Result = TL.getType(); 2962ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 2963ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Result = getDerived().RebuildUnresolvedUsingType(D); 2964ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Result.isNull()) 2965ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 2966ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 2967ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2968ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // We might get an arbitrary type spec type back. We should at 2969ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // least always get a type spec type, though. 2970ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 2971ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewTL.setNameLoc(TL.getNameLoc()); 2972ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2973ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Result; 2974ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 2975ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2977a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2978124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypedefTypeLoc TL, 2979124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2980a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 29827c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(), 29837c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 2984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2987a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2988a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2993a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2994a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2995a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2996a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2998a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 30001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3002a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 3003124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypeOfExprTypeLoc TL, 3004124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3005670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 3006670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 30071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3008cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 3009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 3010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 3011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3013a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3014cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall E.get() != TL.getUnderlyingExpr()) { 3015a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 3016a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3017a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3018577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 3019a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 30201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3021a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 3022cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 3023cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 3024cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 3025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 30281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 3031124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypeOfTypeLoc TL, 3032124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3033cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 3034cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 3035cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (!New_Under_TI) 3036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 30371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3038a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3039cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 3040cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 3041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3042a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 30441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3045a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 3046cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 3047cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 3048cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 3049cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setUnderlyingTInfo(New_Under_TI); 3050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3052577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 30531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 3056124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor DecltypeTypeLoc TL, 3057124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 3059a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3060670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 3061670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 30621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 3064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 3065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 30661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 3070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 3071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 3074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 3075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 3077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 30781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3083a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 3084124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor RecordTypeLoc TL, 3085124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 3087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 30887c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 30897c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 3090577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 3091577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 30921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 3096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 3097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 31001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 3102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 3103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 31061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 3109124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor EnumTypeLoc TL, 3110124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 3112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 31137c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 31147c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 3115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 3116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 31171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 3121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 3122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 3127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 31281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 31317da2431c23ef1ee8acb114e39692246e1801afc2John McCall 31327da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 3133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 3134124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ElaboratedTypeLoc TL, 3135124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 3137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 31397da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 31407da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 31417da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 3146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 3147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 3152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 31531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 31557da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 31561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31573cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived> 31583cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType( 31593cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeLocBuilder &TLB, 31603cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall InjectedClassNameTypeLoc TL, 31613cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType ObjectType) { 31623cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 31633cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.getTypePtr()->getDecl()); 31643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!D) return QualType(); 31653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 31663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 31673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 31683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return T; 31693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 31703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 31711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 3174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 3175124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TemplateTypeParmTypeLoc TL, 3176124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 3178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 31801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 318149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 3182a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 3183124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor SubstTemplateTypeParmTypeLoc TL, 3184124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 318649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 318749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 318849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 3189833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 3190833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *TST, 3191833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 3192833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: this entire method is a temporary workaround; callers 3193833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // should be rewritten to provide real type locs. 3194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3195833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Fake up a TemplateSpecializationTypeLoc. 3196833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder TLB; 3197833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL 3198833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0)); 3199833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3200828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceLocation BaseLoc = getDerived().getBaseLocation(); 3201828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 3202828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setTemplateNameLoc(BaseLoc); 3203828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setLAngleLoc(BaseLoc); 3204828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setRAngleLoc(BaseLoc); 3205833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 3206833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &TA = TST->getArg(i); 3207833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc TAL; 3208833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().InventTemplateArgumentLoc(TA, TAL); 3209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.setArgLocInfo(i, TAL.getLocInfo()); 3210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 3211833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3212833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder IgnoredTLB; 3213833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType); 3214dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 3215dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 3216dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 3217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 3218833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 3219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 3220833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 3221833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 3222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 32231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 3224dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 3225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 3226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 32271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3228d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo NewTemplateArgs; 3229d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 3230d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 3231d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 3232d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) { 3233d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 3234d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc)) 3235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 3236d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.addArgument(Loc); 3237d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 32381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 3240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 3242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 3243833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 3244d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs); 32451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3246833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 3247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 3248833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 3249833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 3250833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 3251833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 3252833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 3253833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 3254833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 32551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3256833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 3257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 32581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 3262124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualifiedNameTypeLoc TL, 3263124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 3265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 3266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 3267124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor SourceRange(), 3268124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 3269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 3270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 32711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 3273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 3274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 32751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 3279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 3280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 3281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 3286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 3287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 32901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 32924714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, 32934714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameTypeLoc TL, 3294124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 32954714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameType *T = TL.getTypePtr(); 3296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /* FIXME: preserve source information better than this */ 3298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR(TL.getNameLoc()); 3299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 3301124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR, 3302edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor ObjectType); 3303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 3304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 33051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 3307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 3310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 3311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 3312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 33131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 3315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 3316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 3317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 33181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33194a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS, 33204a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor NewTemplateId); 3321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 33224a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS, 33234a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor T->getIdentifier(), SR); 3324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 3325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 33284714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 3329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 3330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 33331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 3337124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjCInterfaceTypeLoc TL, 3338124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3339ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // ObjCInterfaceType is never dependent. 3340ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return TL.getType(); 3341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 33421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 3346124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjCObjectPointerTypeLoc TL, 3347124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3348ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // ObjCObjectPointerType is never dependent. 3349ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return TL.getType(); 335024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 335124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 3352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 335443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 33581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 336043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 336643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 337043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 337443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 33781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 338043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 338343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 33851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 3396264c1f8ec895952466eab59b84b8b06801e721faEli Friedman OwningExprResult LHS(SemaRef), RHS(SemaRef); 3397264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 3398264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 3399264c1f8ec895952466eab59b84b8b06801e721faEli Friedman EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 34001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3401264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 3402264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 3403264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 3404264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 34051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3406264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 3407264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 3408264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 3409264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 3410264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 34111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 341443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 341743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 341943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 34341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 343843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 344143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 344343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 344643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 34471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 344943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 345543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 34591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 34601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 346143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 34628cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor OwningExprResult Cond(SemaRef); 34638cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 34648cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 34658cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor ConditionVar 34668cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 3467aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 3468aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 3469aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 34708cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 34718cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor return SemaRef.StmtError(); 347299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 34738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 34748cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 347599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 347699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 347799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 34788cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 34795ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 34801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 348143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 348243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 348343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 348443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 348643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 348743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 348843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 348943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 349143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 349243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 349399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 349443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 349543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 34971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 349899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 349999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), 35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 350143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 350243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 350343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 350443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 35051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 350643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 3507d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor OwningExprResult Cond(SemaRef); 3508d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor VarDecl *ConditionVar = 0; 3509d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (S->getConditionVariable()) { 3510d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor ConditionVar 3511d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor = cast_or_null<VarDecl>( 3512aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 3513aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 3514aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 3515d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (!ConditionVar) 3516d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor return SemaRef.StmtError(); 351799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 3518d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 351999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 352099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 352199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 352299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 35231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35245ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 352599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 352643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 352799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond, 352899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar); 352943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 353043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 35311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 353243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 353343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 353443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 353543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 353743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 353843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 353943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 354043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 354243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 354343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 35441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 354543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 35465656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor OwningExprResult Cond(SemaRef); 35475656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor VarDecl *ConditionVar = 0; 35485656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (S->getConditionVariable()) { 35495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor ConditionVar 35505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor = cast_or_null<VarDecl>( 3551aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 3552aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 3553aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 35545656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (!ConditionVar) 35555656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor return SemaRef.StmtError(); 355699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 35575656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 355899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 355999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 356099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 356199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 35621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35635ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 35641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 356543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 356643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 356743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 356843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 35691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 357143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 357299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 357343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 35741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 35751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar, 357799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 357843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 358043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 358143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 358243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 358343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 358443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 358543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 358643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 35871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 358843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 358943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 359043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 359143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 35921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 359343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 359443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 359543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 35961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 35971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 359843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 359943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 360043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 360143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 36021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 360443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 36051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 360643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 360743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 360843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 360943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 361143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 361299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningExprResult Cond(SemaRef); 361399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *ConditionVar = 0; 361499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (S->getConditionVariable()) { 361599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar 361699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor = cast_or_null<VarDecl>( 3617aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 3618aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 3619aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 362099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (!ConditionVar) 362199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 362299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 362399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 362499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 362599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 362699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 362799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 36281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 362943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 363043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 363143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 363243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 363443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 363543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 363643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 363743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 36381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 363943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 364043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 364143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 364243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 364343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 36441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 36451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 364643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 36475ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson move(Init), getSema().MakeFullExpr(Cond), 364899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar, 36495ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson getSema().MakeFullExpr(Inc), 365043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 365143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 365243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 365343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 36541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 36551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 365643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 36571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 365843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 365943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 366043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 366143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 366243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 36631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 366443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 366543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 366643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 366843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 366943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 36701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 367143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 367243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 367343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 367443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 367543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 367643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 367743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 36781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 368043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 36811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 368243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 368343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 36841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 36851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 368643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 36871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 368843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 368943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 36901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 369143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 369243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 369343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 369443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 36951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 369643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 369743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 369843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 36991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 370043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 370143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 37021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 370343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 370443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 370543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 370643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 3707aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), 3708aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor *D); 370943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 371043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 37111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 371243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 371343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 37141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 371543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 371643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 37171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 371843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 37191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 37201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 372243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 372343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 37241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 372543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 372643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 37271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 372843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 37291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 373043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 373143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 373243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 373343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 373443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 3735703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3736703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema()); 3737703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema()); 3738ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson llvm::SmallVector<IdentifierInfo *, 4> Names; 3739a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 3740703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson OwningExprResult AsmString(SemaRef); 3741703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema()); 3742703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3743703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool ExprsChanged = false; 3744703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3745703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the outputs. 3746703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 3747ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getOutputIdentifier(I)); 3748a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 3749703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 3750703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain()); 3751703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3752703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the output expr. 3753703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *OutputExpr = S->getOutputExpr(I); 3754703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson OwningExprResult Result = getDerived().TransformExpr(OutputExpr); 3755703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 3756703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return SemaRef.StmtError(); 3757703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3758703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != OutputExpr; 3759703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3760703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Exprs.push_back(Result.takeAs<Expr>()); 3761703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 3762703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3763703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the inputs. 3764703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 3765ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getInputIdentifier(I)); 3766a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 3767703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 3768703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Constraints.push_back(S->getInputConstraintLiteral(I)->Retain()); 3769703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3770703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the input expr. 3771703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *InputExpr = S->getInputExpr(I); 3772703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson OwningExprResult Result = getDerived().TransformExpr(InputExpr); 3773703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 3774703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return SemaRef.StmtError(); 3775703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3776703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != InputExpr; 3777703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3778703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Exprs.push_back(Result.takeAs<Expr>()); 3779703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 3780703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3781703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (!getDerived().AlwaysRebuild() && !ExprsChanged) 3782703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return SemaRef.Owned(S->Retain()); 3783703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3784703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the clobbers. 3785703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 3786703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Clobbers.push_back(S->getClobber(I)->Retain()); 3787703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3788703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the asm string literal. 3789703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson AsmString = SemaRef.Owned(S->getAsmString()); 3790703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3791703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return getDerived().RebuildAsmStmt(S->getAsmLoc(), 3792703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isSimple(), 3793703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isVolatile(), 3794703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumOutputs(), 3795703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumInputs(), 3796a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson Names.data(), 3797703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Constraints), 3798703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Exprs), 3799703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move(AsmString), 3800703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Clobbers), 3801703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getRParenLoc(), 3802703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isMSAsm()); 380343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 380443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 380543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 380643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 380743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 38081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 38094dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the body of the @try. 38104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor OwningStmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 38114dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (TryBody.isInvalid()) 38124dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return SemaRef.StmtError(); 38134dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 38148f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor // Transform the @catch statements (if present). 38158f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor bool AnyCatchChanged = false; 38168f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> CatchStmts(SemaRef); 38178f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 38188f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 38194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Catch.isInvalid()) 38204dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return SemaRef.StmtError(); 38218f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor if (Catch.get() != S->getCatchStmt(I)) 38228f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor AnyCatchChanged = true; 38238f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor CatchStmts.push_back(Catch.release()); 38244dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 38254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 38264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the @finally statement (if present). 38274dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor OwningStmtResult Finally(SemaRef); 38284dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (S->getFinallyStmt()) { 38294dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Finally = getDerived().TransformStmt(S->getFinallyStmt()); 38304dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Finally.isInvalid()) 38314dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return SemaRef.StmtError(); 38324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 38334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 38344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // If nothing changed, just retain this statement. 38354dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (!getDerived().AlwaysRebuild() && 38364dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor TryBody.get() == S->getTryBody() && 38378f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor !AnyCatchChanged && 38384dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Finally.get() == S->getFinallyStmt()) 38394dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return SemaRef.Owned(S->Retain()); 38404dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 38414dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Build a new statement. 38424dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), move(TryBody), 38438f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor move_arg(CatchStmts), move(Finally)); 384443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 38451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 384643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 384743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 38481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 3849be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor // Transform the @catch parameter, if there is one. 3850be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *Var = 0; 3851be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (VarDecl *FromVar = S->getCatchParamDecl()) { 3852be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TypeSourceInfo *TSInfo = 0; 3853be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (FromVar->getTypeSourceInfo()) { 3854be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 3855be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (!TSInfo) 3856be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return SemaRef.StmtError(); 3857be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 3858be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor 3859be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor QualType T; 3860be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (TSInfo) 3861be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor T = TSInfo->getType(); 3862be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor else { 3863be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor T = getDerived().TransformType(FromVar->getType()); 3864be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (T.isNull()) 3865be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return SemaRef.StmtError(); 3866be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 3867be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor 3868be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 3869be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (!Var) 3870be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return SemaRef.StmtError(); 3871be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 3872be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor 3873be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 3874be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (Body.isInvalid()) 3875be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return SemaRef.StmtError(); 3876be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor 3877be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 3878be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor S->getRParenLoc(), 3879be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor Var, move(Body)); 388043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 38811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 388243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 388343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 38841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 38854dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the body. 38864dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 38874dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Body.isInvalid()) 38884dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return SemaRef.StmtError(); 38894dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 38904dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // If nothing changed, just retain this statement. 38914dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (!getDerived().AlwaysRebuild() && 38924dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Body.get() == S->getFinallyBody()) 38934dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return SemaRef.Owned(S->Retain()); 38944dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 38954dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Build a new statement. 38964dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 38974dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor move(Body)); 389843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 38991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 390043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 390143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 39021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 3903d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor OwningExprResult Operand(SemaRef); 3904d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (S->getThrowExpr()) { 3905d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor Operand = getDerived().TransformExpr(S->getThrowExpr()); 3906d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (Operand.isInvalid()) 3907d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor return getSema().StmtError(); 3908d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor } 3909d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor 3910d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (!getDerived().AlwaysRebuild() && 3911d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor Operand.get() == S->getThrowExpr()) 3912d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor return getSema().Owned(S->Retain()); 3913d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor 3914d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), move(Operand)); 391543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 39161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 391743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 391843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 391943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 39201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 39218fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Transform the object we are locking. 39228fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor OwningExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 39238fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (Object.isInvalid()) 39248fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor return SemaRef.StmtError(); 39258fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor 39268fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Transform the body. 39278fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 39288fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (Body.isInvalid()) 39298fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor return SemaRef.StmtError(); 39308fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor 39318fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // If nothing change, just retain the current statement. 39328fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (!getDerived().AlwaysRebuild() && 39338fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor Object.get() == S->getSynchExpr() && 39348fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor Body.get() == S->getSynchBody()) 39358fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor return SemaRef.Owned(S->Retain()); 39368fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor 39378fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Build a new statement. 39388fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 39398fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor move(Object), move(Body)); 394043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 394143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 394243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 394343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 394443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 39451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 3946c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the element statement. 3947c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor OwningStmtResult Element = getDerived().TransformStmt(S->getElement()); 3948c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Element.isInvalid()) 3949c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return SemaRef.StmtError(); 3950c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor 3951c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the collection expression. 3952c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor OwningExprResult Collection = getDerived().TransformExpr(S->getCollection()); 3953c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Collection.isInvalid()) 3954c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return SemaRef.StmtError(); 3955c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor 3956c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the body. 3957c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 3958c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Body.isInvalid()) 3959c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return SemaRef.StmtError(); 3960c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor 3961c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // If nothing changed, just retain this statement. 3962c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (!getDerived().AlwaysRebuild() && 3963c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Element.get() == S->getElement() && 3964c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Collection.get() == S->getCollection() && 3965c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Body.get() == S->getBody()) 3966c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return SemaRef.Owned(S->Retain()); 3967c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor 3968c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Build a new statement. 3969c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 3970c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /*FIXME:*/S->getForLoc(), 3971c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor move(Element), 3972c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor move(Collection), 3973c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor S->getRParenLoc(), 3974c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor move(Body)); 397543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 397643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 397743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 397843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 397943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 398043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 398143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 398243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 398343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 398443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 398543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 398643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 398743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 398843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 398943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 399043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 39911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 399243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 399343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 3994a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall ExceptionDecl->getTypeSourceInfo(), 399543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 399643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 399743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 399843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 399943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 400043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 400143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 400243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 400343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 400443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 400643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 400743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 400843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 400943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 401043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 401143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 401243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 40131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 401443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 401543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 401643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 40171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 401843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 401943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 402043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 402143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 402243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 40231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 402443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 402543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 402643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 402743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 40281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 402943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 403043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 403143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 40321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 403343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 403443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 403543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 403643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 40371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 403843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 403943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 404043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 40411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 404243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 404343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 404443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 40451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 404643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 404743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 404843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 40491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 405043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 405143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 40521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 405343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 40541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 405543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 4057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 40591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4060454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 40611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 40631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 40651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 4067a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 4068a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 4069a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4070edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor E->getQualifierRange()); 4071a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 4072a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 4073a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 4074dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 4075dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *ND 40767c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 40777c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getDecl())); 4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4081a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 4082a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 4083a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 4084dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall !E->hasExplicitTemplateArgumentList()) { 40851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4086dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // Mark it referenced in the new context regardless. 4087dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: this is a bit instantiation-specific. 4088dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 4089a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 4090dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return SemaRef.Owned(E->Retain()); 4091a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 4092dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 4093dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 4094dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall if (E->hasExplicitTemplateArgumentList()) { 4095dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgs = &TransArgs; 4096dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 4097dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 4098dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4099dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentLoc Loc; 4100dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 4101dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return SemaRef.ExprError(); 4102dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.addArgument(Loc); 4103dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 4104dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 4105dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 4106a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 4107dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ND, E->getLocation(), TemplateArgs); 4108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4112454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 41131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 41151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4118454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 41191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4124454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 41291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4130454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4136454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 41371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4142454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 41481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 41551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4156454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 4157454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 41621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4171454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 4173a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 41745557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 4175a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 41765ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41795ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41825ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 41831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 41881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 4191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 41931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 4204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4209454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 4210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 42231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 4225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 42311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4232454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 4234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 4252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 4253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 42591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 42611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 4264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 42701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4271454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 427683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 427783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 42781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 427983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4280edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor E->getQualifierRange()); 4281c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 428283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 428383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 42841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4285f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member 42867c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 42877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getMemberDecl())); 4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42916bb8017bb9e828d118e15e59d71c66bba323c364John McCall NamedDecl *FoundDecl = E->getFoundDecl(); 42926bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (FoundDecl == E->getMemberDecl()) { 42936bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl = Member; 42946bb8017bb9e828d118e15e59d71c66bba323c364John McCall } else { 42956bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl = cast_or_null<NamedDecl>( 42966bb8017bb9e828d118e15e59d71c66bba323c364John McCall getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 42976bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!FoundDecl) 42986bb8017bb9e828d118e15e59d71c66bba323c364John McCall return SemaRef.ExprError(); 42996bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 43006bb8017bb9e828d118e15e59d71c66bba323c364John McCall 4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 430383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 43048a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member == E->getMemberDecl() && 43056bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl == E->getFoundDecl() && 43061f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson !E->hasExplicitTemplateArgumentList()) { 43071f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson 43081f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // Mark it referenced in the new context regardless. 43091f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // FIXME: this is a bit instantiation-specific. 43101f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member); 43111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43121f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson } 4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4314d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 43158a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor if (E->hasExplicitTemplateArgumentList()) { 4316d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 4317d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 43188a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4319d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4320d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 43218a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor return SemaRef.ExprError(); 4322d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 43238a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 43248a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 43258a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor 4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4330c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 4331c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 4332c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 4333c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 4334c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 4335c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 4337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 433883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 433983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 43418a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 43426bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl, 4343d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall (E->hasExplicitTemplateArgumentList() 4344d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 4345c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope); 4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 43491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4350454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 43621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 4371454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CompoundAssignOperator *E) { 4372454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformBinaryOperator(E); 4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 43761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4377454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 439747e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 439947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 44041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4405454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 4406a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // Implicit casts are eliminated during transformation, since they 4407a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // will be recomputed by semantic analysis after transformation. 44086eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return getDerived().TransformExpr(E->getSubExprAsWritten()); 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 44121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4413454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 44149d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 44159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 44181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 44211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44229d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 44239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 44249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4428a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 44296eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 44349d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 44361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 44399d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 44451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4446454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 444742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *OldT = E->getTypeSourceInfo(); 444842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 444942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall if (!NewT) 445042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return SemaRef.ExprError(); 44511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 445742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall OldT == NewT && 4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 44591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 44611d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // Note: the expression type doesn't necessarily match the 44621d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // type-as-written, but that's okay, because it should always be 44631d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // derivable from the initializer. 44641d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall 446542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4472454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 44791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 44821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 44901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4491454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 4497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 45031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 45051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 4508e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4513454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 4514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 45151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 451643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 4518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 452143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 4522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 4523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 4524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 4525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 4527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 4528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 4529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 4531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 45331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 45411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 45461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 45481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 4550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 4551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 45611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 45641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 4567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 45681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 4571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 45731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 4577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 45801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 4582454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ImplicitValueInitExpr *E) { 45835557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 45845557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 45855557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 45865557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 4587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 45931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 45991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4600454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 4601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 4602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 46031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 4607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 4608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 46111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 4619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 4623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 46261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4627454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 4628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 4631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 4632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 46381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 4645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 4649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4651454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 4653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4657c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult 4658454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 46591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 4662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4675454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 46801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 46931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 46941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4701454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 47181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 47191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 4721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 47261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4727454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 47281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4733454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 4734668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor switch (E->getOperator()) { 4735668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_New: 4736668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Delete: 4737668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_New: 4738668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_Delete: 4739668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 4740668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4741668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4742668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Call: { 4743668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // This is a call to an object's operator(). 4744668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 4745668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4746668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the object itself. 4747668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor OwningExprResult Object = getDerived().TransformExpr(E->getArg(0)); 4748668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Object.isInvalid()) 4749668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4750668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4751668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor location information 4752668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeLParenLoc 4753668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4754668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Object.get())->getLocEnd()); 4755668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4756668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the call arguments. 4757668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4758668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 4759668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) { 47606eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (getDerived().DropCallArgument(E->getArg(I))) 47616eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor break; 47626eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 4763668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 4764668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Arg.isInvalid()) 4765668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4766668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4767668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor source location information. 4768668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeCommaLoc 4769668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4770668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Arg.get())->getLocEnd()); 4771668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor FakeCommaLocs.push_back(FakeCommaLoc); 4772668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor Args.push_back(Arg.release()); 4773668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4774668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4775668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc, 4776668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor move_arg(Args), 4777668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor FakeCommaLocs.data(), 4778668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor E->getLocEnd()); 4779668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4780668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4781668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 4782668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_##Name: 4783668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 4784668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def" 4785668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Subscript: 4786668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Handled below. 4787668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor break; 4788668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4789668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Conditional: 4790668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("conditional operator is not actually overloadable"); 4791668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4792668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4793668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_None: 4794668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case NUM_OVERLOADED_OPERATORS: 4795668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("not an overloaded operator?"); 4796668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4797668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4798668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4803454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 48171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 48221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4829454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 4830454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCallExpr(E); 4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 48341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4835454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 48369d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 48379d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 48401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 48431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 48459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 48469d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4850a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 48516eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 48569d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 48611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 4864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 4867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 48681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 4869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 48709d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 4875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 48781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4879454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 4880454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4885454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 4886454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 4892454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXReinterpretCastExpr *E) { 4893454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4898454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 4899454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 4905454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXFunctionalCastExpr *E) { 49069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 49079d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 49101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49119d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 49129d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 49139d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 49161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4917a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 49186eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 49239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 49251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 49261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 49309d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4938454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 4939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 494057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *TInfo 494157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor = getDerived().TransformType(E->getTypeOperandSourceInfo()); 494257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor if (!TInfo) 4943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 494657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TInfo == E->getTypeOperandSourceInfo()) 4947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 49481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 494957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getType(), 495057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor E->getLocStart(), 495157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TInfo, 4952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 49541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 49581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 49601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 49671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 49681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 496957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getType(), 497057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor E->getLocStart(), 4971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 49761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4977454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 49781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 4984454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXNullPtrLiteralExpr *E) { 49851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4990454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 4991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 49921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 50001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5001828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 5002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5006454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 5008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 50131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 5016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5020454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 50211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 50227c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 50237c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getParam())); 5024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 5025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 502753cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth if (!getDerived().AlwaysRebuild() && 5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 5029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 50301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5031036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 5032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5036454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 5040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 50451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 50461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 5048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 5049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 5050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5055454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 5056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 5057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 5058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 5059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 5060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 5065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 5068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 5071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 5073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 50781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 507943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 5081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 50891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50901af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform constructor, new operator, and delete operator. 50911af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor CXXConstructorDecl *Constructor = 0; 50921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getConstructor()) { 50931af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor = cast_or_null<CXXConstructorDecl>( 50947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 50957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 50961af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!Constructor) 50971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return SemaRef.ExprError(); 50981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 50991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 51001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorNew = 0; 51011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorNew()) { 51021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew = cast_or_null<FunctionDecl>( 51037c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 51047c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorNew())); 51051af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorNew) 51061af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return SemaRef.ExprError(); 51071af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 51081af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 51091af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 51101af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 51111af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 51127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 51137c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 51141af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 51151af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return SemaRef.ExprError(); 51161af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 51171af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 5118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 5120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 51211af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor == E->getConstructor() && 51221af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew == E->getOperatorNew() && 51231af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete() && 51241af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor !ArgumentChanged) { 51251af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 51261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 51271af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (Constructor) 51281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 51291af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorNew) 51301af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew); 51311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 51321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 51331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 51341af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 51351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51365b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArraySize.get()) { 51375b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // If no array size was specified, but the new expression was 51385b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with an array type (e.g., "new T" where T is 51395b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with "int[4]"), extract the outer bound from the 51405b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // array type as our array size. We do this with constant and 51415b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // dependently-sized array types. 51425b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 51435b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArrayT) { 51445b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // Do nothing 51455b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const ConstantArrayType *ConsArrayT 51465b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<ConstantArrayType>(ArrayT)) { 51475b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ArraySize 51485b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral( 51495b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ConsArrayT->getSize(), 51505b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor SemaRef.Context.getSizeType(), 51515b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor /*FIXME:*/E->getLocStart())); 51525b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = ConsArrayT->getElementType(); 51535b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const DependentSizedArrayType *DepArrayT 51545b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<DependentSizedArrayType>(ArrayT)) { 51555b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (DepArrayT->getSizeExpr()) { 51565b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain()); 51575b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = DepArrayT->getElementType(); 51585b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 51595b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 51605b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 5161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 5163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 5165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 5166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 5167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 5169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 5170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 5171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 51731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 5174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 51751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5178454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 5179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 5180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 51821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51831af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform the delete operator, if known. 51841af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 51851af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 51861af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 51877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 51887c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 51891af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 51901af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return SemaRef.ExprError(); 51911af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 51921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 5193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 51941af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Operand.get() == E->getArgument() && 51951af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete()) { 51961af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 51971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 51981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 51991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 52001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 52011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 52021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 5205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 5206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 5207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 52081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5211a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 5212454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXPseudoDestructorExpr *E) { 5213a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 5214a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 5215a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 52161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5217a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Sema::TypeTy *ObjectTypePtr = 0; 5218a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor bool MayBePseudoDestructor = false; 5219a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 5220a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getOperatorLoc(), 5221a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->isArrow()? tok::arrow : tok::period, 5222a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectTypePtr, 5223a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor MayBePseudoDestructor); 5224a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (Base.isInvalid()) 5225a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return SemaRef.ExprError(); 5226a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 5227a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr); 5228a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 5229a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 5230b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor E->getQualifierRange(), 5231a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectType); 5232a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 5233a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 52341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5235a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed; 5236a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (E->getDestroyedTypeInfo()) { 5237a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedTypeInfo 5238a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType); 5239a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!DestroyedTypeInfo) 5240a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return SemaRef.ExprError(); 5241a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = DestroyedTypeInfo; 5242a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else if (ObjectType->isDependentType()) { 5243a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // We aren't likely to be able to resolve the identifier down to a type 5244a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // now anyway, so just retain the identifier. 5245a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 5246a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 5247a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else { 5248a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // Look for a destructor known with the given name. 5249a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor CXXScopeSpec SS; 5250a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (Qualifier) { 5251a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS.setScopeRep(Qualifier); 5252a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS.setRange(E->getQualifierRange()); 5253a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 5254a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 5255a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(), 5256a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor *E->getDestroyedTypeIdentifier(), 5257a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc(), 5258a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /*Scope=*/0, 5259a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS, ObjectTypePtr, 5260a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor false); 5261a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!T) 5262a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return SemaRef.ExprError(); 5263a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 5264a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed 5265a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 5266a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 5267a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 526826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 526926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeTypeInfo = 0; 527026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (E->getScopeTypeInfo()) { 5271a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(), 5272a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectType); 527326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (!ScopeTypeInfo) 5274a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 5275a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 527626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 5277a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 5278a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 5279a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 5280a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 528126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor E->getQualifierRange(), 528226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor ScopeTypeInfo, 528326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor E->getColonColonLoc(), 5284fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor E->getTildeLoc(), 5285a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed); 5286a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 52871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5288a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 5289a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 5290ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 5291454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall UnresolvedLookupExpr *Old) { 5292f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName()); 5293f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5294f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 5295f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Sema::LookupOrdinaryName); 5296f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5297f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Transform all the decls. 5298f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 5299f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = Old->decls_end(); I != E; ++I) { 53007c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 53017c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getNameLoc(), 53027c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 53039f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 53049f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 53059f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 53069f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 53079f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 53089f54ad4381370c6b771424b53d219e661d6d6706John McCall else 53099f54ad4381370c6b771424b53d219e661d6d6706John McCall return SemaRef.ExprError(); 53109f54ad4381370c6b771424b53d219e661d6d6706John McCall } 5311f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5312f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Expand using declarations. 5313f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (isa<UsingDecl>(InstD)) { 5314f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 5315f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 5316f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = UD->shadow_end(); I != E; ++I) 5317f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(*I); 5318f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall continue; 5319f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 5320f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5321f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(InstD); 5322f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 5323f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5324f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Resolve a kind, but don't do any further analysis. If it's 5325f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // ambiguous, the callee needs to deal with it. 5326f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.resolveKind(); 5327f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5328f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Rebuild the nested-name qualifier, if present. 5329f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 5330f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NestedNameSpecifier *Qualifier = 0; 5331f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Old->getQualifier()) { 5332f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 5333edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor Old->getQualifierRange()); 5334f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Qualifier) 5335f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 5336f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5337f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setScopeRep(Qualifier); 5338f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setRange(Old->getQualifierRange()); 5339f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 5340f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5341f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have no template arguments, it's a normal declaration name. 5342f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Old->hasExplicitTemplateArgs()) 5343f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 5344f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5345f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have template arguments, rebuild them, then rebuild the 5346f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // templateid expression. 5347f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 5348f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 5349f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentLoc Loc; 5350f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc)) 5351f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 5352f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs.addArgument(Loc); 5353f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 5354f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 5355f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(), 5356f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs); 5357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 53581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5361454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 5362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 53631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 5365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 53671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 5370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 53711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 5373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 5374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 53751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 5377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 5378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 5379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 5380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 5381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 53821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5385865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 5386454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall DependentScopeDeclRefExpr *E) { 5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 5388f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 5389edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor E->getQualifierRange()); 5390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 5391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 53921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 539481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 539581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 539681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 53971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5398f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!E->hasExplicitTemplateArgs()) { 5399f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!getDerived().AlwaysRebuild() && 5400f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NNS == E->getQualifier() && 5401f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name == E->getDeclName()) 5402f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.Owned(E->Retain()); 54031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5404f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 5405f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 5406f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 5407f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /*TemplateArgs*/ 0); 5408f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 5409d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 5410d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 5411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 5412d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 5413d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 5415d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 5416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5418f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 5419f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 5420f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 5421f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall &TransArgs); 5422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5426454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 5427321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // CXXConstructExprs are always implicit, so when we have a 5428321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // 1-argument construction we just transform that argument. 5429321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor if (E->getNumArgs() == 1 || 5430321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) 5431321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor return getDerived().TransformExpr(E->getArg(0)); 5432321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor 5433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 5434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 5436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 5438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 5440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 54417c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 54427c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 5443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 5444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 54451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 54481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 5449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 5450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 54516eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (getDerived().DropCallArgument(*Arg)) { 54526eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor ArgumentChanged = true; 54536eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor break; 54546eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 54556eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 5456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 5457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 5458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 54591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 5461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 5462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 5466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 5467c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor !ArgumentChanged) { 54681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark the constructor as referenced. 54691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: Instantiation-specific 5470c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 5471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 5472c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor } 54731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54744411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 54754411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor Constructor, E->isElidable(), 5476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 5477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 5480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 54815132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 54825132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that. 5483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5485454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 54865132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 5487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5489eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// \brief Transform a C++ reference-binding expression. 5490eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// 5491eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// Since CXXBindReferenceExpr nodes are implicitly generated, we just 5492eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// transform the subexpression and return that. 5493eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssontemplate<typename Derived> 5494eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonSema::OwningExprResult 5495eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonTreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) { 5496eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson return getDerived().TransformExpr(E->getSubExpr()); 5497eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson} 5498eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson 54991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 5500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 5501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 55025132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we 55035132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that. 5504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 55075132655e4296b780672e9a96b46a740135073534Douglas Gregor CXXExprWithTemporaries *E) { 55085132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 5509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 55101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 5514454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXTemporaryObjectExpr *E) { 5515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 5516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 5517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 55191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 5521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 55227c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 55237c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 5524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 5525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 55261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 5529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 55301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 5531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 5532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 553391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor if (getDerived().DropCallArgument(*Arg)) { 553491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor ArgumentChanged = true; 553591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor break; 553691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor } 553791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor 5538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 5539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 5540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 55411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 5543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 5544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 5548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 554991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor !ArgumentChanged) { 555091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // FIXME: Instantiation-specific 555191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor); 5552a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth return SemaRef.MaybeBindToTemporary(E->Retain()); 555391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor } 55541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 5556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 55591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 5560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 5563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 5564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 5566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 5567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 55691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 5573454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXUnresolvedConstructExpr *E) { 5574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 5575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 5576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 55781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 5581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 5582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 5583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 5584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 5585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 5586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 5587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 55881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 5590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 5591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 5592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 5593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 5597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 55981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 55991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 5601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 5602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 5603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 5604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 5605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 5606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 56081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5611865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 5612454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXDependentScopeMemberExpr *E) { 5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 5614aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OwningExprResult Base(SemaRef, (Expr*) 0); 5615aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *OldBase; 5616aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 5617aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType ObjectType; 5618aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->isImplicitAccess()) { 5619aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = E->getBase(); 5620aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(OldBase); 5621aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 5622aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 56231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5624aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall // Start the member reference and compute the object's type. 5625aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Sema::TypeTy *ObjectTy = 0; 5626d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor bool MayBePseudoDestructor = false; 5627aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 5628aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall E->getOperatorLoc(), 5629a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 5630d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor ObjectTy, 5631d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor MayBePseudoDestructor); 5632aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 5633aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 5634aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 5635aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = QualType::getFromOpaquePtr(ObjectTy); 5636aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 5637aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 5638aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = 0; 5639aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(E->getBaseType()); 5640aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 5641aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 56421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56436cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 56446cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 5645c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 56466cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 56476cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 56486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 56491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5650a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 5651a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 5652a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 5653a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 5654aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType, 5655aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall FirstQualifierInScope); 5656a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 5657a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 5658a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 56591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 5661dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 5662aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType); 566381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 566481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 56651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5666aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->hasExplicitTemplateArgs()) { 56673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 56683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 56693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 5670aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base.get() == OldBase && 5671aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType == E->getBaseType() && 56723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 56733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 56743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 56751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 56761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5677865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 5678aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 56793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 56803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 56813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 56823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 5683129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall FirstQualifierInScope, 56843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 56853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 5686129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /*TemplateArgs*/ 0); 56873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 56883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 5689d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 56903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 5691d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 5692d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 56933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 5694d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 56953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 56961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5697865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 5698aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 5699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 5701a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 5702a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 57033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 5704129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, 5705129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E->getMemberLoc(), 5706129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall &TransArgs); 5707129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 5708129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5709129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived> 5710129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult 5711454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 5712129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform the base of the expression. 5713aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OwningExprResult Base(SemaRef, (Expr*) 0); 5714aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 5715aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Old->isImplicitAccess()) { 5716aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(Old->getBase()); 5717aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 5718aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 5719aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 5720aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 5721aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(Old->getBaseType()); 5722aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 5723129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5724129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NestedNameSpecifier *Qualifier = 0; 5725129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->getQualifier()) { 5726129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier 5727129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 5728edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor Old->getQualifierRange()); 5729129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Qualifier == 0) 5730129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return SemaRef.ExprError(); 5731129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5732129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5733129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(), 5734129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Sema::LookupOrdinaryName); 5735129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5736129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform all the decls. 5737129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 5738129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = Old->decls_end(); I != E; ++I) { 57397c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 57407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getMemberLoc(), 57417c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 57429f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 57439f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 57449f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 57459f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 57469f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 57479f54ad4381370c6b771424b53d219e661d6d6706John McCall else 57489f54ad4381370c6b771424b53d219e661d6d6706John McCall return SemaRef.ExprError(); 57499f54ad4381370c6b771424b53d219e661d6d6706John McCall } 5750129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5751129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Expand using declarations. 5752129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (isa<UsingDecl>(InstD)) { 5753129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 5754129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 5755129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = UD->shadow_end(); I != E; ++I) 5756129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(*I); 5757129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall continue; 5758129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5759129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5760129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(InstD); 5761129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5762129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5763129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.resolveKind(); 5764129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5765129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentListInfo TransArgs; 5766129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->hasExplicitTemplateArgs()) { 5767129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setLAngleLoc(Old->getLAngleLoc()); 5768129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setRAngleLoc(Old->getRAngleLoc()); 5769129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 5770129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentLoc Loc; 5771129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], 5772129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Loc)) 5773129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return SemaRef.ExprError(); 5774129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.addArgument(Loc); 5775129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5776129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5777c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 5778c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 5779c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 5780c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 5781c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 5782c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 5783129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5784129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return getDerived().RebuildUnresolvedMemberExpr(move(Base), 5785aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 5786129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getOperatorLoc(), 5787129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->isArrow(), 5788129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier, 5789129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getQualifierRange(), 5790c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope, 5791129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R, 5792129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall (Old->hasExplicitTemplateArgs() 5793129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall ? &TransArgs : 0)); 5794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5798454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 57991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 58021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 58031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5804454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 580581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodedTypeInfo 580681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 580781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor if (!EncodedTypeInfo) 5808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 58091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 581181d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 58121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 581581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor EncodedTypeInfo, 5816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5821454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 582292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Transform arguments. 582392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor bool ArgChanged = false; 582492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 582592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 582692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 582792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Arg.isInvalid()) 582892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.ExprError(); 582992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 583092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 583192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Args.push_back(Arg.takeAs<Expr>()); 583292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 583392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 583492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (E->getReceiverKind() == ObjCMessageExpr::Class) { 583592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Class message: transform the receiver type. 583692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor TypeSourceInfo *ReceiverTypeInfo 583792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformType(E->getClassReceiverTypeInfo()); 583892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!ReceiverTypeInfo) 583992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.ExprError(); 584092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 584192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If nothing changed, just retain the existing message send. 584292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!getDerived().AlwaysRebuild() && 584392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 584492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.Owned(E->Retain()); 584592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 584692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Build a new class message send. 584792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 584892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getSelector(), 584992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getMethodDecl(), 585092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getLeftLoc(), 585192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move_arg(Args), 585292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getRightLoc()); 585392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 585492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 585592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Instance message: transform the receiver 585692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 585792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor "Only class and instance messages may be instantiated"); 585892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor OwningExprResult Receiver 585992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformExpr(E->getInstanceReceiver()); 586092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Receiver.isInvalid()) 586192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.ExprError(); 586292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 586392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If nothing changed, just retain the existing message send. 586492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!getDerived().AlwaysRebuild() && 586592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 586692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.Owned(E->Retain()); 586792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 586892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Build a new instance message send. 586992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return getDerived().RebuildObjCMessageExpr(move(Receiver), 587092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getSelector(), 587192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getMethodDecl(), 587292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getLeftLoc(), 587392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move_arg(Args), 587492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getRightLoc()); 5875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 58771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 58781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5879454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 58801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 58831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 58841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5885454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 5886ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return SemaRef.Owned(E->Retain()); 5887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 58891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 58901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5891454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 5892f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // Transform the base expression. 5893f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 5894f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Base.isInvalid()) 5895f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return SemaRef.ExprError(); 5896f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 5897f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // We don't need to transform the ivar; it will never change. 5898f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 5899f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // If nothing changed, just retain the existing expression. 5900f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (!getDerived().AlwaysRebuild() && 5901f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base.get() == E->getBase()) 5902f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return SemaRef.Owned(E->Retain()); 5903f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 5904f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return getDerived().RebuildObjCIvarRefExpr(move(Base), E->getDecl(), 5905f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->getLocation(), 5906f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->isArrow(), E->isFreeIvar()); 5907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 59091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 59101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5911454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 5912e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // Transform the base expression. 5913e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 5914e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Base.isInvalid()) 5915e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor return SemaRef.ExprError(); 5916e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 5917e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // We don't need to transform the property; it will never change. 5918e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 5919e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // If nothing changed, just retain the existing expression. 5920e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (!getDerived().AlwaysRebuild() && 5921e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Base.get() == E->getBase()) 5922e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor return SemaRef.Owned(E->Retain()); 5923e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 5924e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor return getDerived().RebuildObjCPropertyRefExpr(move(Base), E->getProperty(), 5925e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor E->getLocation()); 5926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 59281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 59291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 593009105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 5931454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ObjCImplicitSetterGetterRefExpr *E) { 59329cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor // If this implicit setter/getter refers to class methods, it cannot have any 59339cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor // dependent parts. Just retain the existing declaration. 59349cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor if (E->getInterfaceDecl()) 59359cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor return SemaRef.Owned(E->Retain()); 59369cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor 59379cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor // Transform the base expression. 59389cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 59399cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor if (Base.isInvalid()) 59409cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor return SemaRef.ExprError(); 59419cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor 59429cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor // We don't need to transform the getters/setters; they will never change. 59439cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor 59449cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor // If nothing changed, just retain the existing expression. 59459cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor if (!getDerived().AlwaysRebuild() && 59469cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor Base.get() == E->getBase()) 59479cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor return SemaRef.Owned(E->Retain()); 59489cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor 59499cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor return getDerived().RebuildObjCImplicitSetterGetterRefExpr( 59509cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor E->getGetterMethod(), 59519cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor E->getType(), 59529cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor E->getSetterMethod(), 59539cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor E->getLocation(), 59549cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor move(Base)); 59559cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor 5956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 59581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 59591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5960454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 5961ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // Can never occur in a dependent context. 59621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 59651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 59661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5967454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 5968f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // Transform the base expression. 5969f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 5970f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Base.isInvalid()) 5971f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return SemaRef.ExprError(); 5972f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 5973f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // If nothing changed, just retain the existing expression. 5974f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (!getDerived().AlwaysRebuild() && 5975f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base.get() == E->getBase()) 5976f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return SemaRef.Owned(E->Retain()); 5977f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 5978f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return getDerived().RebuildObjCIsaExpr(move(Base), E->getIsaMemberLoc(), 5979f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->isArrow()); 5980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 59821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 59831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5984454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 5985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 5987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 5988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 5989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 59911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 5993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 5994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 59951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 59981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 59991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 6001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 6002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 60051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 60061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 6007454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 6008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 6009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 60101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 6011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 60131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 60141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 6015454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 6016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 6017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 60181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 6019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 6022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 6023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 6024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 60251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 602685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 602785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 602885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star, 6029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 6030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 60321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 603385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 603485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 603585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star, 6036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 6037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 60391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 60401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 604185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 604285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 604385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 604485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(), 604585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 6046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 60481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 60491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 605085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 605185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 605285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 60530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 605485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 6055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 6056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 60581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 6059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 6060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 6061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 6062577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 6063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 6064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 6065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 6066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 6067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 6068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 60691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 60711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 60721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 60731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 6074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 6075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 6076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 6077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 6078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 6079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 6080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 6081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 60821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 60841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 6085577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 60861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 6087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 60881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 60901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 60911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 6092577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 6093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 609485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 609585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 60961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 609785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 6098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 6099577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 61011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 61021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 6103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 610485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 610585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 61061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 610785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 6108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 61091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 61111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 61121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 6113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 6114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 6115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 6116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 61171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 6118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 6119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 6120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 6121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 61231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 61241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 6125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 6126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 6127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 6128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 61291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 6130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 6131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 6132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 6133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 6135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 613682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson unsigned NumElements, 613782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson bool IsAltiVec, bool IsPixel) { 6138577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 613982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return SemaRef.Context.getVectorType(ElementType, NumElements, 614082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson IsAltiVec, IsPixel); 6141577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 61421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 6144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 6145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 6146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 6147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 6148577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 6149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 61501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 6151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 6152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 6153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 6154577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 61551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6156577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 61571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 61581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 6159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 6160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 6161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 6162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 61631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 6165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 61661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 6167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 61681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 6169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 61701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 6171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 6172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 6173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 6174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 61751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 6177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 6178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 6179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 6180a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 6181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 6182ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 6183ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(D && "no decl found"); 6184ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (D->isInvalidDecl()) return QualType(); 6185ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 618692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // FIXME: Doesn't account for ObjCInterfaceDecl! 6187ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeDecl *Ty; 6188ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (isa<UsingDecl>(D)) { 6189ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Using = cast<UsingDecl>(D); 6190ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(Using->isTypeName() && 6191ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-typename using"); 6192ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 6193ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // A valid resolved using typename decl points to exactly one type decl. 6194ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(++Using->shadow_begin() == Using->shadow_end()); 6195ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 6196ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 6197ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } else { 6198ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(isa<UnresolvedUsingTypenameDecl>(D) && 6199ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-using decl"); 6200ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<UnresolvedUsingTypenameDecl>(D); 6201ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 6202ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 6203ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return SemaRef.Context.getTypeDeclType(Ty); 6204ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 6205ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 6206ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> 6207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 6208577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 6209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 6210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 6212577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 6213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 6214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 6215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 6217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 6218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 6219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 6220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 6222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 6223833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 6224833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 6225d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 6226d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 6227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 62281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6229dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 6230dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 6231dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 6232dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 6233a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 6234c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 6235d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NamedDecl *FirstQualifierInScope) { 6236dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 6237dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 6238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 6239dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 6240dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 62411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 6242495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 6243c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 6244c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 624546646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner false, false)); 6246dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 6247dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 6248dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 6249dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 6250dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 6251dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 6252dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 6253dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 6254dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 6255dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 6256dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 6257dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 6258dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 6259dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 6260dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 6261edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor QualType T) { 6262edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor if (T->isDependentType() || T->isRecordType() || 6263dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 6264a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here"); 6265dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 6266dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 6267dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 62681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6269dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 6270dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 6271dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 62721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6273d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 62741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 6275d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 6276d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 6277d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 62781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 6279d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 6280d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 6281d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 6282d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 62831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 6284d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 62853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 62863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 6287d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 6288d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 62891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 6290014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor UnqualifiedId Name; 6291014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation()); 62923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 62933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 62943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 6295014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name, 6296a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 6297a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 62983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 6299d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 63001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 6302ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 6303ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 6304ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 6305ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 6306ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor CXXScopeSpec SS; 6307ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 6308ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setScopeRep(Qualifier); 6309ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 6310ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SourceLocation SymbolLocations[3]; // FIXME: Bogus location information. 6311ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(), 6312ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Operator, SymbolLocations); 6313ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getSema().ActOnDependentTemplateName( 6314ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 6315ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS, 6316ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name, 6317a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 6318a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 6319ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor .template getAsVal<TemplateName>(); 6320ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 6321ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 6322ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 63231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 6324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 6325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 6326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 6327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 6328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 6329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 6330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 6331ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts(); 6332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 63331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 6335f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 6336f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (!FirstExpr->getType()->isOverloadableType() && 6337f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl !SecondExpr->getType()->isOverloadableType()) 6338f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return getSema().CreateBuiltinArraySubscriptExpr(move(First), 6339ba13543329afac4a0d01304ec2ec4924d99306a6John McCall CalleeExpr->getLocStart(), 6340f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(Second), OpLoc); 63411a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 63421a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 63431a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc); 6344f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl } else if (SecondExpr == 0 || isPostIncDec) { 6345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 6346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 6347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 63481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 6349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 63501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 6352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 6353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 63541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 6355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 6356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 6357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 6358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 63591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 6360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 6361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 6362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 63631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 6365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 6366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 6367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 6368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 63691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 6371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 63726e26689f5d513e24ad7783a4493201930fdeccc0John McCall UnresolvedSet<16> Functions; 63731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6374ba13543329afac4a0d01304ec2ec4924d99306a6John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) { 6375ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 6376ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 6377ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 6378ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 63796e26689f5d513e24ad7783a4493201930fdeccc0John McCall Functions.append(ULE->decls_begin(), ULE->decls_end()); 6380ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 63816e26689f5d513e24ad7783a4493201930fdeccc0John McCall Functions.addDecl(cast<DeclRefExpr>(CalleeExpr)->getDecl()); 6382ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 63831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 6385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 6386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 63871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 6389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 63901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 6391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 6392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 6393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 63941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6395f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 6396ba13543329afac4a0d01304ec2ec4924d99306a6John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(), 6397ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 6398ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(First), 6399ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(Second)); 6400f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 6401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 64021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 6403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 64041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 6405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 6406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 6407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 64081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 6410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 64111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 6412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 64131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 641426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived> 641526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorSema::OwningExprResult 641626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(ExprArg Base, 641726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation OperatorLoc, 641826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor bool isArrow, 641926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor NestedNameSpecifier *Qualifier, 642026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceRange QualifierRange, 642126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeType, 642226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation CCLoc, 6423fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 6424a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed) { 642526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor CXXScopeSpec SS; 642626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (Qualifier) { 642726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS.setRange(QualifierRange); 642826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS.setScopeRep(Qualifier); 642926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor } 643026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 643126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor Expr *BaseE = (Expr *)Base.get(); 643226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor QualType BaseType = BaseE->getType(); 6433a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (BaseE->isTypeDependent() || Destroyed.getIdentifier() || 643426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor (!isArrow && !BaseType->getAs<RecordType>()) || 643526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor (isArrow && BaseType->getAs<PointerType>() && 6436bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif !BaseType->getAs<PointerType>()->getPointeeType() 6437bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif ->template getAs<RecordType>())){ 643826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // This pseudo-destructor expression is still a pseudo-destructor. 643926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor return SemaRef.BuildPseudoDestructorExpr(move(Base), OperatorLoc, 644026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor isArrow? tok::arrow : tok::period, 6441fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SS, ScopeType, CCLoc, TildeLoc, 6442a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed, 644326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*FIXME?*/true); 644426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor } 644526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 6446a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 644726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor DeclarationName Name 644826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 644926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType->getType())); 645026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 645126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // FIXME: the ScopeType should be tacked onto SS. 645226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 645326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 645426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor OperatorLoc, isArrow, 645526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS, /*FIXME: FirstQualifier*/ 0, 6456a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Name, Destroyed.getLocation(), 645726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*TemplateArgs*/ 0); 645826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor} 645926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 6460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 6461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 6463