TreeTransform.h revision 21ef0fa27b0783ec0bc6aa5b524feb2ec840f952
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); 3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 34343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 345454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult Transform##Node(Node *E); 346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 35985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 36185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \brief Build a new reference type given the type it references. 362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// By default, performs semantic analysis when building the 36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// reference type. Subclasses may override this routine to provide 36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// different behavior. 366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \param LValue whether the type was written with an lvalue sigil 36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// or an rvalue sigil. 36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildReferenceType(QualType ReferentType, 37085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool LValue, 37185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 37885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 37985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new Objective C object pointer type. 38285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildObjCObjectPointerType(QualType PointeeType, 38385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 3981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 40785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 40885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 41785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 41885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 44782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 44882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson bool IsAltiVec, bool IsPixel); 4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 479ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// \brief Rebuild an unresolved typename type, given the decl that 480ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// the UnresolvedUsingTypenameDecl was transformed to. 481ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType RebuildUnresolvedUsingType(Decl *D); 482ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4977da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4987da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4997da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 5007da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 5017da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 526833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateLoc, 527d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args); 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 5321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 5361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 5411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 544ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor if (NNS->isDependent()) { 545ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor CXXScopeSpec SS; 546ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor SS.setScopeRep(NNS); 547ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor if (!SemaRef.computeDeclContext(SS)) 548ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor return SemaRef.Context.getTypenameType(NNS, 549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 550ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor } 5511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 5531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 5581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildTypenameType(NestedNameSpecifier *NNS, 561833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const IdentifierInfo *Id, 562833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR) { 563833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.CheckTypenameType(NNS, *Id, SR); 564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 5651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 574a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 575c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 576c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 577dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 578dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 579dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 580dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 581dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 582dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 583dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 584dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 585dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 586dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 587dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 588dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 589dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 590dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 591dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 592dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 593dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 594dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 595dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 596dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 597edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor QualType T); 598d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 599d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 600d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 601d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 602d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 603d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 604d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 605d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 606d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 607d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 608d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 609d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 610d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 611d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 612d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 613d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 614d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 615d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 616d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 6173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 6183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 6191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 620ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// \brief Build a new template name given a nested name specifier and the 621ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// overloaded operator name that is referred to as a template. 622ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// 623ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// By default, performs semantic analysis to determine whether the name can 624ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 625ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// template name. Subclasses may override this routine to provide different 626ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// behavior. 627ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 628ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 629ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType); 630ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 69299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, StmtArg Then, 69399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor SourceLocation ElseLoc, StmtArg Else) { 69499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar), 69599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), ElseLoc, move(Else)); 69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(Sema::FullExprArg Cond, 70399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar) { 70499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnStartOfSwitchStmt(Cond, DeclPtrTy::make(CondVar)); 70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 72399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 72599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, DeclPtrTy::make(CondVar), 72699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 7381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 74899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor StmtArg Init, Sema::FullExprArg Cond, 74999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *CondVar, Sema::FullExprArg Inc, 75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 75199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond, 75299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor DeclPtrTy::make(CondVar), 75399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Inc, RParenLoc, move(Body)); 75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 78143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 7821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 7911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 800703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// \brief Build a new inline asm statement. 801703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// 802703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// By default, performs semantic analysis to build the new statement. 803703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// Subclasses may override this routine to provide different behavior. 804703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc, 805703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool IsSimple, 806703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool IsVolatile, 807703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson unsigned NumOutputs, 808703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson unsigned NumInputs, 809ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson IdentifierInfo **Names, 810703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Constraints, 811703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Exprs, 812703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprArg AsmString, 813703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Clobbers, 814703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson SourceLocation RParenLoc, 815703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool MSAsm) { 816703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 817703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson NumInputs, Names, move(Constraints), 818703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move(Exprs), move(AsmString), move(Clobbers), 819703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson RParenLoc, MSAsm); 820703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 821703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 82243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 82343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 82443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 82543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 8261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 827a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *Declarator, 82843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 82943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 83043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 83243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 83343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 83443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 83643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 83743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 83943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 84043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 84143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 84243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 84443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 84543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 84743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 84843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 84943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 85043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 85143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 85243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 85343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 85443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 85543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 861f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 862f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 863f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL) { 864f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 865f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 866f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 867f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 868f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// \brief Build a new expression that references a declaration. 869f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// 870f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// By default, performs semantic analysis to build the new expression. 871f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Subclasses may override this routine to provide different behavior. 872a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier, 873a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 874dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *VD, SourceLocation Loc, 875dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo *TemplateArgs) { 876a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 877a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setScopeRep(Qualifier); 878a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setRange(QualifierRange); 879dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 880dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: loses template args. 881dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 882dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return getSema().BuildDeclarationNameExpr(SS, Loc, VD); 883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 8861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 894a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 8951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 896a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 897a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 898a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 899a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 900a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 901a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor NestedNameSpecifier *Qualifier, 90226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceRange QualifierRange, 90326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeType, 90426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation CCLoc, 905fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 906a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed); 9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 9156ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr)); 916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 922a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo, 9235ab75172051a6d2ea71a80a79e81c65519fd3462John McCall SourceLocation OpLoc, 924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 925a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R); 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 9401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 9461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 9541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 9591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 9711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 9751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 97683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 97783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 97883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 979f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member, 980d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *ExplicitTemplateArgs, 9818a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor NamedDecl *FirstQualifierInScope) { 982d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 983d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 984d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98683a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor Expr *BaseExpr = Base.takeAs<Expr>(); 9875fccd36204f11c8491325038e6ffcc784399098eDouglas Gregor if (getSema().PerformObjectMemberConversion(BaseExpr, Qualifier, Member)) 98883a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor return getSema().ExprError(); 9898aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 99183a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor new (getSema().Context) MemberExpr(BaseExpr, isArrow, 992d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 993d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 994d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 995d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 99783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 99883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 99983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 100083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 100183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 100283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 1003aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType = ((Expr*) Base.get())->getType(); 1004aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 1005c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall LookupResult R(getSema(), Member->getDeclName(), MemberLoc, 1006c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall Sema::LookupMemberName); 1007c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R.addDecl(Member); 1008c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R.resolveKind(); 1009c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 1010aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 1011aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OpLoc, isArrow, 1012129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 1013c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, ExplicitTemplateArgs); 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 10236ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, 10246ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor LHS.takeAs<Expr>(), RHS.takeAs<Expr>()); 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 10411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 10459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 1048b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 1049b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall move(SubExpr)); 1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 10531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 105742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *TInfo, 1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 106042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 106142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall move(Init)); 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 10651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 1072aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 1073129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall CXXScopeSpec SS; 1074aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType = ((Expr*) Base.get())->getType(); 1075aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 1076129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OpLoc, /*IsArrow*/ false, 1077129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, /*FirstQualifierInScope*/ 0, 10782d1c21414199a7452f122598189363a3922605b1Douglas Gregor DeclarationName(&Accessor), 1079129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall AccessorLoc, 1080129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /* TemplateArgs */ 0); 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 10841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1089e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor SourceLocation RBraceLoc, 1090e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor QualType ResultTy) { 1091e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor OwningExprResult Result 1092e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1093e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor if (Result.isInvalid() || ResultTy->isDependentType()) 1094e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1095e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor 1096e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // Patch in the result type we were given, which may have been computed 1097e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // when the initial InitListExpr was built. 1098e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1099e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor ILE->setType(ResultTy); 1100e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 11171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 11321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 11421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1148f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc, 1149f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian move(SubExprs)); 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 11531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 12031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 12111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 12161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12219d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 12289d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 12291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 12339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 12341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 12389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 12391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 12401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 12421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 12449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 12451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12629d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1267c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 1268c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1269c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1270c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12799d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1284c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 1285c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1286c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1287c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 12969d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1301c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1302c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1303c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1304c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 13139d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1318c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 1319c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall TInfo, move(SubExpr), 1320c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1321c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 13299d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 133388650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 13359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TInfo->getType().getAsOpaquePtr(), 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 133788650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) 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 RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 13671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 13751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 13771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1378828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor QualType ThisType, 1379828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor bool isImplicit) { 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1381828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, 1382828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor isImplicit)); 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1398036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 1399036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param) { 1400036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc, 1401036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor Param)); 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 14081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 14121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 14141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 14221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 14701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 14741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1479865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS, 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1483f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall const TemplateArgumentListInfo *TemplateArgs) { 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1487f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1488f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (TemplateArgs) 1489f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location, 1490f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall *TemplateArgs); 1491f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1492f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location); 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 1500f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 1501f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL, 1502d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 1503f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs); 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 15114411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor SourceLocation Loc, 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 15154411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef); 15164411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, 15174411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ConvertedArgs)) 15184411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().ExprError(); 15194411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor 15204411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 15214411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor move_arg(ConvertedArgs)); 1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1565865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE, 1566aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1569a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1570a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1571129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NamedDecl *FirstQualifierInScope, 1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1573c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1574129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1576a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1577a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1579aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, 1580aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1581129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 1582129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, MemberLoc, TemplateArgs); 1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1585129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Build a new member reference expression. 15863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1589129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE, 1590aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1591129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 1592129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool IsArrow, 1593129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NestedNameSpecifier *Qualifier, 1594129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceRange QualifierRange, 1595c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope, 1596129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult &R, 1597129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 15983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 16003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 16011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1602aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, 1603aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1604c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall SS, FirstQualifierInScope, 1605c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, TemplateArgs); 16063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 16071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 16171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 16331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 16441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 16521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 16540da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor BuiltinLoc); 1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 16561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 167843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 167943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 168243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 168543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 168643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 168743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 168843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 169043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 169143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 169209cc141c89a5e9f305c17d7a88298647df16ceddJohn McCall#define ABSTRACT_EXPR(Node, Parent) 169343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 169443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 169543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 169643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 169743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 169843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17005ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson return getSema().ActOnExprStmt(getSema().MakeFullExpr(E)); 170143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 17021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 170443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 170543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 17061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1708670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1709454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 171609cc141c89a5e9f305c17d7a88298647df16ceddJohn McCall#define ABSTRACT_EXPR(Node, Parent) 1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1718454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 17201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1723657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1724657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1725657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1726dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1728a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1729c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1730c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 17310979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 17320979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 17331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 173443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1736dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1738c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1739c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1741dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 17421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1744c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1745a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1746c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1752a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1753a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1754a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1758a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1759c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1760c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 17657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Range.getBegin(), 17667c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NNS->getAsNamespace())); 17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1769dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1770dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1772dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1773dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1776dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1778dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1780dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1781dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1782fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 1783124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0), 1784124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 1785d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1786d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1788dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1789dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1790dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1791dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1795edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor T); 1796dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1797dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1799dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 18001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1801dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1802dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1803dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 18041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 180581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1806dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 1807dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 180881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 180981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 181181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 181281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 181381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 181481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 181581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 181681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 18173e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 181881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 18201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 182181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 182281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 182381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 182481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 1825124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType T = getDerived().TransformType(Name.getCXXNameType(), 1826124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 182781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 182881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 183081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 18311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 183281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 183381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 18341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 183681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 183781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 183881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 183981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 18401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 18413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 18423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 18437c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor SourceLocation Loc = getDerived().getBaseLocation(); 18447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor 1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 18461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1848124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation()), 1849124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 1850d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 18541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 18557c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template)); 1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1860d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1865d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1868f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they make it into the AST. 1869f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded template name survived to here"); 1870d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1875124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation()), 1876124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 18773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1878d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1880d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1881dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 1882dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 1883d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1885ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1886ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(), 1887ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1888ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 1889ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, DTN->getOperator(), 1890ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1891d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1893d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 18941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 18957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template)); 1896d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1897d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1899d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1900d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1901d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 19021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1903d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1904d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 19051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1906f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they reach the AST. 1907f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(false && "overloaded function decl survived to here"); 1908f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return TemplateName(); 1909d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1910d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1911d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 1914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 1916670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1917670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 19189f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("null template argument in TreeTransform"); 1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 1923a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 1924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1927788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 1928788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(Arg, SourceRange(), Loc); 1929788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor break; 1930788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1935833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 1936670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 1938828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 1941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 1942833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 1944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 1946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 1948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 1949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 1950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 1952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 19531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1954670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1955a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = Input.getTypeSourceInfo(); 1956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 1957a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 1958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 1960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 1961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 1963833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1964670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1966670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1967833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 1968972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 1969972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 1970972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 1971788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), Name); 19727c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl()); 1973833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 1974833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1975828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 1976828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 1977828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 1978828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Action::Unevaluated); 1979828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr); 1980828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (E.isInvalid()) 1981828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = NULL; 1982828bff2079b6a91ecd7ed5b842c59527d7682789John McCall else { 1983828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = E.takeAs<Expr>(); 1984828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr->Retain(); 1985828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1986828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1987828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 1988828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 1989833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1990670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1992788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: { 1993788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName()); 1994788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateName Template 1995788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor = getDerived().TransformTemplateName(Arg.getAsTemplate()); 1996788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor if (Template.isNull()) 1997788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return true; 1998788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1999788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(TemplateArgument(Template), 2000788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateQualifierRange(), 2001788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateNameLoc()); 2002788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return false; 2003788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor } 2004788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 2005670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 2006670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 2008670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 20091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2010833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 2011833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 2012833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2013833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Sema::OwningExprResult E 2014833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 2015833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2017833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *ETaken = E.takeAs<Expr>(); 2018828bff2079b6a91ecd7ed5b842c59527d7682789John McCall ETaken->Retain(); 2019833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken); 2020833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2021670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2023670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 2024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 2025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 2027670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 2028670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 20291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2030833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2031833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2032833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2033828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2034828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2035828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2036828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2037833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2038833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2039828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2040670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2041670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 2043670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 2044828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Result, Input.getLocInfo()); 2045833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2046670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2047670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2049670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2050833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2051670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2052670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2058124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T, 2059124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2065a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T); 20664802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2068124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType); 20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 20721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 2074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2077124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI, 2078124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 2080a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 20811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 20831bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 2084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 20861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2087124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType Result = getDerived().TransformType(TLB, TL, ObjectType); 2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 20901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2091a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TLB.getTypeSourceInfo(SemaRef.Context, Result); 2092577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2096124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T, 2097124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 2102124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \ 2103124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21079f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("unhandled type loc!"); 2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 21161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 2119124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualifiedTypeLoc T, 2120124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2121a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers Quals = T.getType().getLocalQualifiers(); 2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2123124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(), 2124124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 21331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make 2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work. 2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \ 2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 216185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType, \ 216285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); \ 2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \ 2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setSigilLoc(TL.getSigilLoc()); \ 2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0) 2172a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2175124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor BuiltinTypeLoc T, 2176124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2177ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 2178ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.setBuiltinLoc(T.getBuiltinLoc()); 2179ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor if (T.needsExtraLocalData()) 2180ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 2181ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return T.getType(); 2182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2186124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ComplexTypeLoc T, 2187124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2194124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor PointerTypeLoc TL, 2195124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(PointerType); 2197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2198577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2202124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor BlockPointerTypeLoc TL, 2203124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(BlockPointerType); 2205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 220785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 220985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 221085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 221285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 221385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 2214124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ReferenceTypeLoc TL, 2215124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 221685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 221785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 221985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 222085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 222185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 222285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 222385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 222485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 222585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 222685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 222785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 222885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 222985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 223085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 223185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 223285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 223385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 223485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 223585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 223685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 223785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 223885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 223985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 224085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 224185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 224285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 224385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2247124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor LValueReferenceTypeLoc TL, 2248124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2249124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor return TransformReferenceType(TLB, TL, ObjectType); 2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2252a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2255124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor RValueReferenceTypeLoc TL, 2256124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2257124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor return TransformReferenceType(TLB, TL, ObjectType); 2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2263124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor MemberPointerTypeLoc TL, 2264124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2271a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 228185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 228285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 22931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2296124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ConstantArrayTypeLoc TL, 2297124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 230985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 231085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 23181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2319a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2332124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor IncompleteArrayTypeLoc TL, 2333124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2343a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 234485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 234585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2361124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor VariableArrayTypeLoc TL, 2362124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2363a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2368670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2369670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2370670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 238685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2403124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor DependentSizedArrayTypeLoc TL, 2404124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2410670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2411670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 24121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 242885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 24331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2447124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor DependentSizedExtVectorTypeLoc TL, 2448124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2456670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2457670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2458670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2465eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2466eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2485a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2490124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor VectorTypeLoc TL, 2491124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 250082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 250182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson T->isAltiVec(), T->isPixel()); 2502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2504a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 25081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2514124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ExtVectorTypeLoc TL, 2515124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 25331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 25371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 253821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl * 253921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) { 254021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 254121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *NewDI = getDerived().TransformType(OldDI); 254221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewDI) 254321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return 0; 254421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 254521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (NewDI == OldDI) 254621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return OldParm; 254721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall else 254821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return ParmVarDecl::Create(SemaRef.Context, 254921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getDeclContext(), 255021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getLocation(), 255121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getIdentifier(), 255221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewDI->getType(), 255321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewDI, 255421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getStorageClass(), 255521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /* DefArg */ NULL); 255621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall} 255721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 255821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived> 255921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>:: 256021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TransformFunctionTypeParams(FunctionProtoTypeLoc TL, 256121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVectorImpl<QualType> &PTypes, 256221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVectorImpl<ParmVarDecl*> &PVars) { 2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 25641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 257221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall assert(OldParm->getTypeSourceInfo()->getType() == T->getArgType(i)); 257321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 257421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewParm = getDerived().TransformFunctionTypeParam(OldParm); 257521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewParm) 257621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return true; 2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 258721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return true; 2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 259021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall PTypes.push_back(NewType); 259121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall PVars.push_back(NewParm); 2592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 25931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 259421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return false; 259521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall} 259621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 259721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived> 259821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType 259921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 260021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall FunctionProtoTypeLoc TL, 260121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall QualType ObjectType) { 260221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall FunctionProtoType *T = TL.getTypePtr(); 260321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 260421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (ResultType.isNull()) 260521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return QualType(); 260621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 260721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall // Transform the parameters. 260821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVector<QualType, 4> ParamTypes; 260921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 261021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls)) 261121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return QualType(); 261221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 26251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2638124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor FunctionNoProtoTypeLoc TL, 2639124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2657ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType 2658ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 2659124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor UnresolvedUsingTypeLoc TL, 2660124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2661ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UnresolvedUsingType *T = TL.getTypePtr(); 26627c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 2663ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (!D) 2664ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 2665ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2666ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType Result = TL.getType(); 2667ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 2668ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Result = getDerived().RebuildUnresolvedUsingType(D); 2669ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Result.isNull()) 2670ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 2671ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 2672ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2673ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // We might get an arbitrary type spec type back. We should at 2674ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // least always get a type spec type, though. 2675ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 2676ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewTL.setNameLoc(TL.getNameLoc()); 2677ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2678ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Result; 2679ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 2680ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2683124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypedefTypeLoc TL, 2684124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 26877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(), 26887c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 2689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 2708124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypeOfExprTypeLoc TL, 2709124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2710670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2711670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2713cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2719cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall E.get() != TL.getUnderlyingExpr()) { 2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 27251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 2727cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 2728cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2729cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2732577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 2736124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypeOfTypeLoc TL, 2737124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2738cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 2739cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 2740cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (!New_Under_TI) 2741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2744cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 2745cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 27491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 2751cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 2752cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2753cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2754cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setUnderlyingTInfo(New_Under_TI); 2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2757577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 2761124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor DecltypeTypeLoc TL, 2762124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2765670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2766670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 27671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2769577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2770577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2778577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2785577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2786577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 2789124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor RecordTypeLoc TL, 2790124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 2792577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 27937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 27947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 2795577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2796577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2798a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2800a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 2801a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 2802a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2803a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2804a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 28051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 2807a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2808a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2810577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 2814124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor EnumTypeLoc TL, 2815124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 2817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 28187c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 28197c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 2820577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2821577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2823a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2824a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2825a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 2826a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 2827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2828a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2829a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2830a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2831a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 2832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 28331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2835577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28367da2431c23ef1ee8acb114e39692246e1801afc2John McCall 28377da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 2838a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 2839124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ElaboratedTypeLoc TL, 2840124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2841a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 2842a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2843a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 28447da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 28457da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 28467da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 28471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2848a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2849a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2850a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2851a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2852a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2853a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2854a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2855a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2856a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 2857a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 28581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 28607da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 28611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28623cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived> 28633cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType( 28643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeLocBuilder &TLB, 28653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall InjectedClassNameTypeLoc TL, 28663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType ObjectType) { 28673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 28683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.getTypePtr()->getDecl()); 28693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!D) return QualType(); 28703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 28713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 28723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 28733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return T; 28743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 28753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 28761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2878577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2879a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2880124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TemplateTypeParmTypeLoc TL, 2881124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2882a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 2883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 288649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2888124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor SubstTemplateTypeParmTypeLoc TL, 2889124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 289149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 289249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 289349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2894833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2895833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *TST, 2896833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2897833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: this entire method is a temporary workaround; callers 2898833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // should be rewritten to provide real type locs. 2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2900833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Fake up a TemplateSpecializationTypeLoc. 2901833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder TLB; 2902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL 2903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0)); 2904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2905828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceLocation BaseLoc = getDerived().getBaseLocation(); 2906828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2907828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setTemplateNameLoc(BaseLoc); 2908828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setLAngleLoc(BaseLoc); 2909828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setRAngleLoc(BaseLoc); 2910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &TA = TST->getArg(i); 2912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc TAL; 2913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().InventTemplateArgumentLoc(TA, TAL); 2914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.setArgLocInfo(i, TAL.getLocInfo()); 2915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2916833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder IgnoredTLB; 2918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType); 2919dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 2920dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 2921dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 2922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 2924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 2925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 2927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 29281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2929dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2933d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo NewTemplateArgs; 2934d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 2935d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 2936d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 2937d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) { 2938d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 2939d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc)) 2940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2941d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.addArgument(Loc); 2942d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 29431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 2945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 2947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 2948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 2949d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs); 29501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 2952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 2953833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 2954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 2955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 2956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 2957833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 2958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 2959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 29601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 2962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2965a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2966a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 2967124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualifiedNameTypeLoc TL, 2968124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 2969a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 2970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2972124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor SourceRange(), 2973124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjectType); 2974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2978577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2981a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2983a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 2984a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 2985a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 2986a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2987a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2988a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 2991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2993a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2997a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB, 2998124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor TypenameTypeLoc TL, 2999124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 3000a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameType *T = TL.getTypePtr(); 3001833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3002833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /* FIXME: preserve source information better than this */ 3003833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR(TL.getNameLoc()); 3004833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3005577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 3006124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR, 3007edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor ObjectType); 3008577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 3009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 30101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3011a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 3012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 3015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 3016577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 3017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 30181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3019577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 3020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 3021577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 3022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 30231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, NewTemplateId); 3025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 3026833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR); 3027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 3028a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3031a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result); 3032a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 3033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3034a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 30361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3038a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 3040124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjCInterfaceTypeLoc TL, 3041124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 304254e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCInterfaceType unimplemented"); 304354e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 3044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 30451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 3049124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor ObjCObjectPointerTypeLoc TL, 3050124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor QualType ObjectType) { 305154e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCObjectPointerType unimplemented"); 305254e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 305324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 305424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 3055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 305843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 30611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 306343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 306443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 306643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 306743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 306843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 306943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 307043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 307143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 307343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 307443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 307543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 307643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 307743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 307943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 30811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 30851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 30881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 309243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 3099264c1f8ec895952466eab59b84b8b06801e721faEli Friedman OwningExprResult LHS(SemaRef), RHS(SemaRef); 3100264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 3101264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 3102264c1f8ec895952466eab59b84b8b06801e721faEli Friedman EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3104264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 3105264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 3106264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 3107264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 31081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3109264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 3110264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 3111264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 3112264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 3113264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 31141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 311543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 311643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 311743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 311843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 311943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 312043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 312143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 312243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 312443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 312743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 312843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 314443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 314543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 315143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 315243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 315343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 315643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 315743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 315943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 31621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 31631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 31658cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor OwningExprResult Cond(SemaRef); 31668cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 31678cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 31688cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor ConditionVar 31698cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 3170aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 3171aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 3172aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 31738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 31748cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor return SemaRef.StmtError(); 317599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 31768cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 31778cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 317899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 317999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 318099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 31818cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 31825ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 319699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 31991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 320299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Then), 32031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 3210d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor OwningExprResult Cond(SemaRef); 3211d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor VarDecl *ConditionVar = 0; 3212d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (S->getConditionVariable()) { 3213d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor ConditionVar 3214d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor = cast_or_null<VarDecl>( 3215aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 3216aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 3217aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 3218d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (!ConditionVar) 3219d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor return SemaRef.StmtError(); 322099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 3221d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 322299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 322399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 322499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 322599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 32261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32275ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 322899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 323099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond, 323199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar); 323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 323843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 324143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 324343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 324843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 32495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor OwningExprResult Cond(SemaRef); 32505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor VarDecl *ConditionVar = 0; 32515656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (S->getConditionVariable()) { 32525656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor ConditionVar 32535656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor = cast_or_null<VarDecl>( 3254aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 3255aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 3256aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 32575656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (!ConditionVar) 32585656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor return SemaRef.StmtError(); 325999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 32605656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 326199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 326299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 326399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 326499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 32651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32665ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond)); 32671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 327143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 327443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 327599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 32771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar, 328099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor move(Body)); 328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 328643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 328843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 329443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 32991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 330943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 331243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 331599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor OwningExprResult Cond(SemaRef); 331699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *ConditionVar = 0; 331799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (S->getConditionVariable()) { 331899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar 331999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor = cast_or_null<VarDecl>( 3320aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 3321aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 3322aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 332399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (!ConditionVar) 332499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 332599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 332699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 332799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor 332899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 332999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return SemaRef.StmtError(); 333099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 33311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 333543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 333843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 334343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 334643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 33471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 33481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 33505ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson move(Init), getSema().MakeFullExpr(Cond), 335199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar, 33525ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson getSema().MakeFullExpr(Inc), 335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 335443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 33571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 33581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 33731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 337443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 338043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 33821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 338343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 33881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 33981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 340343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 34051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 340643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 3410aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), 3411aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor *D); 341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 341943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 34301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 34321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 3438703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3439703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema()); 3440703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema()); 3441ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson llvm::SmallVector<IdentifierInfo *, 4> Names; 3442a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 3443703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson OwningExprResult AsmString(SemaRef); 3444703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema()); 3445703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3446703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool ExprsChanged = false; 3447703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3448703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the outputs. 3449703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 3450ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getOutputIdentifier(I)); 3451a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 3452703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 3453703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain()); 3454703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3455703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the output expr. 3456703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *OutputExpr = S->getOutputExpr(I); 3457703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson OwningExprResult Result = getDerived().TransformExpr(OutputExpr); 3458703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 3459703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return SemaRef.StmtError(); 3460703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3461703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != OutputExpr; 3462703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3463703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Exprs.push_back(Result.takeAs<Expr>()); 3464703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 3465703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3466703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the inputs. 3467703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 3468ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getInputIdentifier(I)); 3469a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 3470703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 3471703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Constraints.push_back(S->getInputConstraintLiteral(I)->Retain()); 3472703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3473703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the input expr. 3474703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *InputExpr = S->getInputExpr(I); 3475703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson OwningExprResult Result = getDerived().TransformExpr(InputExpr); 3476703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 3477703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return SemaRef.StmtError(); 3478703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3479703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != InputExpr; 3480703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3481703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Exprs.push_back(Result.takeAs<Expr>()); 3482703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 3483703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3484703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (!getDerived().AlwaysRebuild() && !ExprsChanged) 3485703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return SemaRef.Owned(S->Retain()); 3486703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3487703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the clobbers. 3488703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 3489703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Clobbers.push_back(S->getClobber(I)->Retain()); 3490703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3491703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the asm string literal. 3492703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson AsmString = SemaRef.Owned(S->getAsmString()); 3493703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 3494703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return getDerived().RebuildAsmStmt(S->getAsmLoc(), 3495703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isSimple(), 3496703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isVolatile(), 3497703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumOutputs(), 3498703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumInputs(), 3499a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson Names.data(), 3500703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Constraints), 3501703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Exprs), 3502703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move(AsmString), 3503703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Clobbers), 3504703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getRParenLoc(), 3505703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isMSAsm()); 350643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 350743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 350843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 350943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 351043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 35111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 351243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 351343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 35141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 351543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 35161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 351743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 351843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 35191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 352043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 352143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 352243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 352343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 352543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 352643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 35271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 352843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 352943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 353143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 35321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 353343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 353443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 35351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 353643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 353743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 353943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 35401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 354143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 354243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 354343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 354543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 354643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 35471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 354843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 354943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 355043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 355143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 355243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 35531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 355443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 355543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 35561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 355743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 355843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 355943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 356043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 356143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 356243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 356343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 356443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 356543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 356643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 356743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 356843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 356943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 357043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 357143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 357243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 35731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 357543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 3576a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall ExceptionDecl->getTypeSourceInfo(), 357743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 357843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 357943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 358043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 358143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 358243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 358343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 358443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 358543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 358643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 35871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 358843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 358943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 359043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 359143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 359243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 359343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 359443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 35951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 359643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 359743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 359843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 35991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 360043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 360143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 360243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 360343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 360443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 36051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 360743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 360843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 360943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 361143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 361243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 361343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 361543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 361643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 361743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 361843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 36191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 362043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 362143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 362243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 36231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 362443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 362543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 362643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 36271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 362843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 362943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 363043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 36311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 363243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 363343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 36341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 363543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 36361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 363743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 3639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 36401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3642454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 36431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 36441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 36451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3648454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 3649a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3650a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 3651a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3652edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor E->getQualifierRange()); 3653a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 3654a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3655a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3656dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3657dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *ND 36587c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 36597c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getDecl())); 3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3663a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 3664a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 3665a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 3666dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall !E->hasExplicitTemplateArgumentList()) { 36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3668dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // Mark it referenced in the new context regardless. 3669dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: this is a bit instantiation-specific. 3670dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 3671a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3672dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return SemaRef.Owned(E->Retain()); 3673a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3674dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3675dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 3676dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall if (E->hasExplicitTemplateArgumentList()) { 3677dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgs = &TransArgs; 3678dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 3679dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 3680dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3681dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentLoc Loc; 3682dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 3683dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall return SemaRef.ExprError(); 3684dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.addArgument(Loc); 3685dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 3686dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 3687dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 3688a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 3689dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ND, E->getLocation(), TemplateArgs); 3690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 36911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3694454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 36951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3700454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 37011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3706454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 37111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3712454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 37131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3718454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 37191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3724454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 37301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 37371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3738454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 3739454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 37441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3753454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 3755a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 37565557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 3757a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 37585ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37615ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37645ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 37651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 37701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 37751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3791454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 38051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 38131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3814454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 38321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 38431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 38521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3853454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 385883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 385983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 38601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 386183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3862edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor E->getQualifierRange()); 3863c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 386483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 386583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 38661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3867f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member 38687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 38697c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getMemberDecl())); 3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 387583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 38768a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member == E->getMemberDecl() && 38771f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson !E->hasExplicitTemplateArgumentList()) { 38781f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson 38791f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // Mark it referenced in the new context regardless. 38801f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // FIXME: this is a bit instantiation-specific. 38811f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member); 38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38831f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson } 3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3885d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 38868a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor if (E->hasExplicitTemplateArgumentList()) { 3887d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 3888d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 38898a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3890d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 3891d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 38928a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor return SemaRef.ExprError(); 3893d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 38948a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 38958a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 38968a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor 3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3901c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 3902c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 3903c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 3904c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 3905c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 3906c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 390983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 391083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 39128a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 3913d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall (E->hasExplicitTemplateArgumentList() 3914d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 3915c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope); 3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3920454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 39321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 39381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3941454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CompoundAssignOperator *E) { 3942454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformBinaryOperator(E); 3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3947454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 396747e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 39681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 396947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 39741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3975454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 3976a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // Implicit casts are eliminated during transformation, since they 3977a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // will be recomputed by semantic analysis after transformation. 39786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return getDerived().TransformExpr(E->getSubExprAsWritten()); 3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3983454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 39849d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 39859d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 39881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 39911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39929d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 39939d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 39949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3998a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 39996eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 40049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 40099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4016454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 401742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *OldT = E->getTypeSourceInfo(); 401842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 401942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall if (!NewT) 402042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return SemaRef.ExprError(); 40211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 402742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall OldT == NewT && 4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 40291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 40311d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // Note: the expression type doesn't necessarily match the 40321d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // type-as-written, but that's okay, because it should always be 40331d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // derivable from the initializer. 40341d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall 403542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4042454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 40491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 40521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4061454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 40631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 40751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 4078e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4083454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 40851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 408643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 409143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 41111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 41181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 41341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 41431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 4152454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ImplicitValueInitExpr *E) { 41535557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 41545557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 41555557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 41565557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4170454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 41731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 41901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 4193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4197454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 4210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4221454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4227c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult 4228454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 4232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4245454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 4247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 4252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 4253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 42631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4271454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 42881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4297454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 42981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4303454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 4304668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor switch (E->getOperator()) { 4305668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_New: 4306668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Delete: 4307668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_New: 4308668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_Delete: 4309668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 4310668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4311668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4312668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Call: { 4313668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // This is a call to an object's operator(). 4314668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 4315668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4316668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the object itself. 4317668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor OwningExprResult Object = getDerived().TransformExpr(E->getArg(0)); 4318668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Object.isInvalid()) 4319668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4320668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4321668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor location information 4322668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeLParenLoc 4323668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4324668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Object.get())->getLocEnd()); 4325668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4326668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the call arguments. 4327668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4328668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 4329668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) { 43306eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (getDerived().DropCallArgument(E->getArg(I))) 43316eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor break; 43326eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 4333668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 4334668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Arg.isInvalid()) 4335668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4336668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4337668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor source location information. 4338668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeCommaLoc 4339668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4340668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Arg.get())->getLocEnd()); 4341668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor FakeCommaLocs.push_back(FakeCommaLoc); 4342668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor Args.push_back(Arg.release()); 4343668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4344668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4345668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc, 4346668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor move_arg(Args), 4347668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor FakeCommaLocs.data(), 4348668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor E->getLocEnd()); 4349668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4350668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4351668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 4352668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_##Name: 4353668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 4354668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def" 4355668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Subscript: 4356668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Handled below. 4357668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor break; 4358668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4359668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Conditional: 4360668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("conditional operator is not actually overloadable"); 4361668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4362668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4363668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_None: 4364668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case NUM_OVERLOADED_OPERATORS: 4365668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("not an overloaded operator?"); 4366668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor return SemaRef.ExprError(); 4367668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 4368668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4373454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 43871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 43881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 43921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4399454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 4400454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCallExpr(E); 4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 44041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4405454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 44069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 44079d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 44101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 44131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44149d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 44159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 44169d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4420a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 44216eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 44269d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 44281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 44311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 44381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 44409d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 44481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4449454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 4450454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4455454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 4456454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 4462454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXReinterpretCastExpr *E) { 4463454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4468454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 4469454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 4475454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXFunctionalCastExpr *E) { 44769d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *OldT; 44779d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *NewT; 4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 44801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44819d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT = E->getTypeInfoAsWritten(); 44829d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT = getDerived().TransformType(OldT); 44839d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall if (!NewT) 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4487a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor OwningExprResult SubExpr 44886eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 44939d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall OldT == NewT && 4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 44951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 45009d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall NewT, 4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4508454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 4518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 45191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 45251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 45291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 45311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 45381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 45471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4548454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 45491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 4555454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXNullPtrLiteralExpr *E) { 45561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4561454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 45631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 45711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4572828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 4573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4577454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 4578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 4587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4591454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 45921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 45937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 45947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getParam())); 4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 459853cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth if (!getDerived().AlwaysRebuild() && 4599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 4600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4602036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 4603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4607454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 4608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 46161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 46171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 4619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4626454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 4627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 4628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 4631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 4634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 4642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 4643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 465043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 4653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 46601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform constructor, new operator, and delete operator. 46621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor CXXConstructorDecl *Constructor = 0; 46631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getConstructor()) { 46641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor = cast_or_null<CXXConstructorDecl>( 46657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 46667c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 46671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!Constructor) 46681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return SemaRef.ExprError(); 46691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 46701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 46711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorNew = 0; 46721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorNew()) { 46731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew = cast_or_null<FunctionDecl>( 46747c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 46757c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorNew())); 46761af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorNew) 46771af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return SemaRef.ExprError(); 46781af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 46791af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 46801af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 46811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 46821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 46837c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 46847c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 46851af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 46861af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return SemaRef.ExprError(); 46871af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 46881af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 46921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor == E->getConstructor() && 46931af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew == E->getOperatorNew() && 46941af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete() && 46951af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor !ArgumentChanged) { 46961af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 46971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 46981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (Constructor) 46991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 47001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorNew) 47011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew); 47021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 47031af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 47041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 47051af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47075b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArraySize.get()) { 47085b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // If no array size was specified, but the new expression was 47095b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with an array type (e.g., "new T" where T is 47105b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with "int[4]"), extract the outer bound from the 47115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // array type as our array size. We do this with constant and 47125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // dependently-sized array types. 47135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 47145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArrayT) { 47155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // Do nothing 47165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const ConstantArrayType *ConsArrayT 47175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<ConstantArrayType>(ArrayT)) { 47185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ArraySize 47195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral( 47205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ConsArrayT->getSize(), 47215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor SemaRef.Context.getSizeType(), 47225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor /*FIXME:*/E->getLocStart())); 47235b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = ConsArrayT->getElementType(); 47245b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const DependentSizedArrayType *DepArrayT 47255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<DependentSizedArrayType>(ArrayT)) { 47265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (DepArrayT->getSizeExpr()) { 47275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain()); 47285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = DepArrayT->getElementType(); 47295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 47305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 47315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 47441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4749454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47541af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform the delete operator, if known. 47551af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 47561af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 47571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 47587c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 47597c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 47601af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 47611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor return SemaRef.ExprError(); 47621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 47631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 47651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Operand.get() == E->getArgument() && 47661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete()) { 47671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 47681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 47691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 47701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 47711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 47721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4782a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 4783454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXPseudoDestructorExpr *E) { 4784a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4785a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 4786a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 47871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4788a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Sema::TypeTy *ObjectTypePtr = 0; 4789a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor bool MayBePseudoDestructor = false; 4790a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4791a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getOperatorLoc(), 4792a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4793a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectTypePtr, 4794a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor MayBePseudoDestructor); 4795a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (Base.isInvalid()) 4796a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return SemaRef.ExprError(); 4797a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 4798a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr); 4799a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 4800a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4801b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor E->getQualifierRange(), 4802a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectType); 4803a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 4804a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 48051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4806a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed; 4807a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (E->getDestroyedTypeInfo()) { 4808a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedTypeInfo 4809a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType); 4810a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!DestroyedTypeInfo) 4811a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return SemaRef.ExprError(); 4812a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = DestroyedTypeInfo; 4813a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else if (ObjectType->isDependentType()) { 4814a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // We aren't likely to be able to resolve the identifier down to a type 4815a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // now anyway, so just retain the identifier. 4816a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 4817a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 4818a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else { 4819a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // Look for a destructor known with the given name. 4820a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor CXXScopeSpec SS; 4821a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (Qualifier) { 4822a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS.setScopeRep(Qualifier); 4823a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS.setRange(E->getQualifierRange()); 4824a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 4825a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 4826a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(), 4827a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor *E->getDestroyedTypeIdentifier(), 4828a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc(), 4829a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /*Scope=*/0, 4830a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS, ObjectTypePtr, 4831a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor false); 4832a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!T) 4833a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return SemaRef.ExprError(); 4834a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor 4835a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed 4836a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 4837a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 4838a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 483926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 484026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeTypeInfo = 0; 484126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (E->getScopeTypeInfo()) { 4842a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(), 4843a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectType); 484426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (!ScopeTypeInfo) 4845a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 4846a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 484726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 4848a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 4849a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 4850a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 4851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 485226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor E->getQualifierRange(), 485326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor ScopeTypeInfo, 485426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor E->getColonColonLoc(), 4855fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor E->getTildeLoc(), 4856a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed); 4857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 4860a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 4861ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 4862454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall UnresolvedLookupExpr *Old) { 4863f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName()); 4864f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4865f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 4866f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Sema::LookupOrdinaryName); 4867f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4868f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Transform all the decls. 4869f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 4870f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = Old->decls_end(); I != E; ++I) { 48717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 48727c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getNameLoc(), 48737c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 48749f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 48759f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 48769f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 48779f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 48789f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 48799f54ad4381370c6b771424b53d219e661d6d6706John McCall else 48809f54ad4381370c6b771424b53d219e661d6d6706John McCall return SemaRef.ExprError(); 48819f54ad4381370c6b771424b53d219e661d6d6706John McCall } 4882f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4883f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Expand using declarations. 4884f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (isa<UsingDecl>(InstD)) { 4885f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 4886f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 4887f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = UD->shadow_end(); I != E; ++I) 4888f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(*I); 4889f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall continue; 4890f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4891f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4892f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(InstD); 4893f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4894f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4895f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Resolve a kind, but don't do any further analysis. If it's 4896f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // ambiguous, the callee needs to deal with it. 4897f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.resolveKind(); 4898f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4899f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Rebuild the nested-name qualifier, if present. 4900f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 4901f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NestedNameSpecifier *Qualifier = 0; 4902f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Old->getQualifier()) { 4903f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 4904edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor Old->getQualifierRange()); 4905f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Qualifier) 4906f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4907f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4908f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setScopeRep(Qualifier); 4909f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall SS.setRange(Old->getQualifierRange()); 4910f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4911f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4912f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have no template arguments, it's a normal declaration name. 4913f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Old->hasExplicitTemplateArgs()) 4914f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 4915f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4916f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have template arguments, rebuild them, then rebuild the 4917f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // templateid expression. 4918f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 4919f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 4920f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentLoc Loc; 4921f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc)) 4922f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.ExprError(); 4923f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs.addArgument(Loc); 4924f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 4925f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 4926f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(), 4927f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs); 4928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4932454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 4933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 49341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 4936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 4941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 49421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 4944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 4945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 49461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 4949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 4950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4956865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 4957454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall DependentScopeDeclRefExpr *E) { 4958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4959f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4960edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor E->getQualifierRange()); 4961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 496581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 496681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 496781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 49681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4969f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!E->hasExplicitTemplateArgs()) { 4970f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!getDerived().AlwaysRebuild() && 4971f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall NNS == E->getQualifier() && 4972f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name == E->getDeclName()) 4973f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return SemaRef.Owned(E->Retain()); 49741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4975f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4976f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 4977f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 4978f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /*TemplateArgs*/ 0); 4979f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 4980d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 4981d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4983d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4984d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 4985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4986d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 4987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4989f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4990f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E->getQualifierRange(), 4991f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Name, E->getLocation(), 4992f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall &TransArgs); 4993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4997454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 4998321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // CXXConstructExprs are always implicit, so when we have a 4999321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // 1-argument construction we just transform that argument. 5000321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor if (E->getNumArgs() == 1 || 5001321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) 5002321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor return getDerived().TransformExpr(E->getArg(0)); 5003321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor 5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 5009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 5011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 50127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 50137c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 5014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 50191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 5020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 5021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 50226eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (getDerived().DropCallArgument(*Arg)) { 50236eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor ArgumentChanged = true; 50246eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor break; 50256eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 50266eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 5027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 5029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 5032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 5033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 5038c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor !ArgumentChanged) { 50391af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark the constructor as referenced. 50401af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: Instantiation-specific 5041c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 5042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 5043c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor } 50441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50454411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 50464411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor Constructor, E->isElidable(), 5047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 5048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 5051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 50525132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 50535132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that. 5054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5056454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 50575132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 5058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5060eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// \brief Transform a C++ reference-binding expression. 5061eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// 5062eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// Since CXXBindReferenceExpr nodes are implicitly generated, we just 5063eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// transform the subexpression and return that. 5064eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssontemplate<typename Derived> 5065eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonSema::OwningExprResult 5066eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonTreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) { 5067eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson return getDerived().TransformExpr(E->getSubExpr()); 5068eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson} 5069eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson 50701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 5071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 50735132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we 50745132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that. 5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 50785132655e4296b780672e9a96b46a740135073534Douglas Gregor CXXExprWithTemporaries *E) { 50795132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 5085454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXTemporaryObjectExpr *E) { 5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 50937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 50947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 5096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 51011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 5103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 510491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor if (getDerived().DropCallArgument(*Arg)) { 510591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor ArgumentChanged = true; 510691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor break; 510791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor } 510891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor 5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 5111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 51121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 5114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 5115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 51161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 512091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor !ArgumentChanged) { 512191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // FIXME: Instantiation-specific 512291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor); 5123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 512491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor } 51251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 51301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 5131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 5132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 5134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 5135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 5137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 5138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 51401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 5144454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXUnresolvedConstructExpr *E) { 5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 5146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 5147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 51491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 5152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 5153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 5155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 5158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 51591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 5161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 5163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 51651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 51701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 5174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 5175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 5177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 51791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5182865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 5183454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXDependentScopeMemberExpr *E) { 5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 5185aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OwningExprResult Base(SemaRef, (Expr*) 0); 5186aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *OldBase; 5187aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 5188aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType ObjectType; 5189aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->isImplicitAccess()) { 5190aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = E->getBase(); 5191aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(OldBase); 5192aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 5193aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 51941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5195aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall // Start the member reference and compute the object's type. 5196aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Sema::TypeTy *ObjectTy = 0; 5197d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor bool MayBePseudoDestructor = false; 5198aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 5199aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall E->getOperatorLoc(), 5200a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 5201d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor ObjectTy, 5202d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor MayBePseudoDestructor); 5203aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 5204aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 5205aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 5206aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = QualType::getFromOpaquePtr(ObjectTy); 5207aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 5208aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 5209aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = 0; 5210aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(E->getBaseType()); 5211aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 5212aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 52131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52146cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 52156cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 5216c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 52176cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 52186cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 52196cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5221a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 5222a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 5223a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 5224a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 5225aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType, 5226aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall FirstQualifierInScope); 5227a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 5228a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 5229a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 52301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 5232dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 5233aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType); 523481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 523581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 52361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5237aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->hasExplicitTemplateArgs()) { 52383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 52393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 52403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 5241aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base.get() == OldBase && 5242aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType == E->getBaseType() && 52433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 52443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 52453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 52461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 52471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5248865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 5249aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 52503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 52513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 52523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 52533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 5254129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall FirstQualifierInScope, 52553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 52563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 5257129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /*TemplateArgs*/ 0); 52583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 52593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 5260d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 52613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 5262d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 5263d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 52643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 5265d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 52663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 52671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5268865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 5269aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 5270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 5271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 5272a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 5273a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 52743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 5275129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Name, 5276129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E->getMemberLoc(), 5277129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall &TransArgs); 5278129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 5279129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5280129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived> 5281129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult 5282454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 5283129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform the base of the expression. 5284aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OwningExprResult Base(SemaRef, (Expr*) 0); 5285aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 5286aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Old->isImplicitAccess()) { 5287aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(Old->getBase()); 5288aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 5289aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return SemaRef.ExprError(); 5290aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 5291aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 5292aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(Old->getBaseType()); 5293aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 5294129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5295129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NestedNameSpecifier *Qualifier = 0; 5296129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->getQualifier()) { 5297129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier 5298129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall = getDerived().TransformNestedNameSpecifier(Old->getQualifier(), 5299edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor Old->getQualifierRange()); 5300129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Qualifier == 0) 5301129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return SemaRef.ExprError(); 5302129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5303129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5304129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(), 5305129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Sema::LookupOrdinaryName); 5306129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5307129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform all the decls. 5308129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 5309129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = Old->decls_end(); I != E; ++I) { 53107c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 53117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getMemberLoc(), 53127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 53139f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 53149f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 53159f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 53169f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 53179f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 53189f54ad4381370c6b771424b53d219e661d6d6706John McCall else 53199f54ad4381370c6b771424b53d219e661d6d6706John McCall return SemaRef.ExprError(); 53209f54ad4381370c6b771424b53d219e661d6d6706John McCall } 5321129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5322129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Expand using declarations. 5323129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (isa<UsingDecl>(InstD)) { 5324129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 5325129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 5326129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = UD->shadow_end(); I != E; ++I) 5327129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(*I); 5328129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall continue; 5329129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5330129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5331129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(InstD); 5332129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5333129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5334129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.resolveKind(); 5335129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5336129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentListInfo TransArgs; 5337129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->hasExplicitTemplateArgs()) { 5338129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setLAngleLoc(Old->getLAngleLoc()); 5339129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setRAngleLoc(Old->getRAngleLoc()); 5340129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) { 5341129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentLoc Loc; 5342129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], 5343129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Loc)) 5344129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return SemaRef.ExprError(); 5345129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.addArgument(Loc); 5346129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5347129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 5348c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 5349c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 5350c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 5351c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 5352c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 5353c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 5354129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 5355129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return getDerived().RebuildUnresolvedMemberExpr(move(Base), 5356aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 5357129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getOperatorLoc(), 5358129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->isArrow(), 5359129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier, 5360129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getQualifierRange(), 5361c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope, 5362129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R, 5363129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall (Old->hasExplicitTemplateArgs() 5364129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall ? &TransArgs : 0)); 5365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5369454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 53701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 53731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 53741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5375454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 5376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 5377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 5378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 5379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 5380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 53811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 53841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 5388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 53901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 5393454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 5394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 53961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 53991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5401454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 54021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5407454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 54081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 5409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 54107c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 54117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getProtocol())); 5412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 5413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 54171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 54181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 5420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 5421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 5422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 5423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 54241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5429454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 5430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 54321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5437454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 5438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 54401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 544509105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 5446454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ObjCImplicitSetterGetterRefExpr *E) { 5447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 54491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5454454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 5455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 54571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5462454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 5463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 54651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5470454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 5471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 5473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 5474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 5475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 54771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 5479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 5480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 54811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 54841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 54851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 5487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 5488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 54921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5493454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 5494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 54961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 55001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5501454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 5502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 55041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 55061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 5509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 55111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 551285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 551385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 551485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star, 5515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 55181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 551985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 552085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 552185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star, 5522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 55251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 55261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 552785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 552885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 552985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 553085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(), 553185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 55341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 55351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 553685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 553785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 553885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 55390953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 554085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 55441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 554585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType, 554685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 554785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil, 5548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseEntity()); 5549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 5553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 5554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 5556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 5557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 5559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 5560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 5561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 5562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 55631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 55651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 55661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 55671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 5568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 5569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 5570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 5571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 5572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 5573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 5574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 5575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 55761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 55781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 5579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 55801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 5581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 55821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 55841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 55851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 5586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 558885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 558985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 55901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 559185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 55951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 55961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 5597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 559885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 559985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 56001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 560185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 56031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 56051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 56061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 5607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 56111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 56171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 56181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 5619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 56231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 563082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson unsigned NumElements, 563182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson bool IsAltiVec, bool IsPixel) { 5632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 563382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return SemaRef.Context.getVectorType(ElementType, NumElements, 563482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson IsAltiVec, IsPixel); 5635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 56361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 5639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 5640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 5642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 5643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 56441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 5645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 5647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 56491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 56511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 56521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 5653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 5656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 56571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 56601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 5661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 56621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 5663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 56641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 5665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 5666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 5667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 5668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 56691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 5672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 5673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5675a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5676ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 5677ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(D && "no decl found"); 5678ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (D->isInvalidDecl()) return QualType(); 5679ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5680ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeDecl *Ty; 5681ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (isa<UsingDecl>(D)) { 5682ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Using = cast<UsingDecl>(D); 5683ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(Using->isTypeName() && 5684ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-typename using"); 5685ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5686ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // A valid resolved using typename decl points to exactly one type decl. 5687ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(++Using->shadow_begin() == Using->shadow_end()); 5688ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 5689ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5690ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } else { 5691ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(isa<UnresolvedUsingTypenameDecl>(D) && 5692ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-using decl"); 5693ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<UnresolvedUsingTypenameDecl>(D); 5694ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 5695ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5696ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return SemaRef.Context.getTypeDeclType(Ty); 5697ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 5698ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 5699ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> 5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 5701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 5702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 5706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 5707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 5711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 5712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 5716833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 5717833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 5718d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 5719d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 5720577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 57211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5722dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5723dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5726a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 5727c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 5728d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NamedDecl *FirstQualifierInScope) { 5729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 5730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 5731dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 5732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 5733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 57341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 5735495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 5736c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 5737c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 573846646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner false, false)); 5739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5741dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5744dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 5746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 5747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 5754edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor QualType T) { 5755edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor if (T->isDependentType() || T->isRecordType() || 5756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 5757a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here"); 5758dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 5759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 5760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 57611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 5763dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 5764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 57651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5766d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 57671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5768d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5769d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5770d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 57711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 5772d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 5773d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5774d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5775d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 57761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5777d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 57783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 57793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 5780d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 5781d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 57821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 5783014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor UnqualifiedId Name; 5784014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation()); 57853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 57863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 57873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 5788014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name, 5789a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5790a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 57913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 5792d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 57931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5795ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5796ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5797ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 5798ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 5799ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor CXXScopeSpec SS; 5800ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 5801ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setScopeRep(Qualifier); 5802ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 5803ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SourceLocation SymbolLocations[3]; // FIXME: Bogus location information. 5804ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(), 5805ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Operator, SymbolLocations); 5806ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getSema().ActOnDependentTemplateName( 5807ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 5808ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS, 5809ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name, 5810a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5811a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 5812ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor .template getAsVal<TemplateName>(); 5813ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5814ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5815ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 58161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 5818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 5819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 5820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 5821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 5822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 5823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 5824ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts(); 5825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 58261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 5828f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 5829f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (!FirstExpr->getType()->isOverloadableType() && 5830f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl !SecondExpr->getType()->isOverloadableType()) 5831f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return getSema().CreateBuiltinArraySubscriptExpr(move(First), 5832ba13543329afac4a0d01304ec2ec4924d99306a6John McCall CalleeExpr->getLocStart(), 5833f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(Second), OpLoc); 58341a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 58351a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 58361a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc); 5837f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl } else if (SecondExpr == 0 || isPostIncDec) { 5838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 5839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 5840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 58411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 58431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 5845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 58471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 5848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 5849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 5850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 5851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 58521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 5854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 58561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 5859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 5860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 58621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 5864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 58656e26689f5d513e24ad7783a4493201930fdeccc0John McCall UnresolvedSet<16> Functions; 58661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5867ba13543329afac4a0d01304ec2ec4924d99306a6John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) { 5868ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 5869ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 5870ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 5871ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 58726e26689f5d513e24ad7783a4493201930fdeccc0John McCall Functions.append(ULE->decls_begin(), ULE->decls_end()); 5873ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 58746e26689f5d513e24ad7783a4493201930fdeccc0John McCall Functions.addDecl(cast<DeclRefExpr>(CalleeExpr)->getDecl()); 5875ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 58761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 5878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 5879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 58801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 5882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 58831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 5885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 5886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 58871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5888f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 5889ba13543329afac4a0d01304ec2ec4924d99306a6John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(), 5890ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 5891ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(First), 5892ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(Second)); 5893f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 5894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 58951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 5896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 58971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 5899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 59011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 59041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 5905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 590726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived> 590826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorSema::OwningExprResult 590926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(ExprArg Base, 591026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation OperatorLoc, 591126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor bool isArrow, 591226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor NestedNameSpecifier *Qualifier, 591326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceRange QualifierRange, 591426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeType, 591526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation CCLoc, 5916fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 5917a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed) { 591826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor CXXScopeSpec SS; 591926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (Qualifier) { 592026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS.setRange(QualifierRange); 592126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS.setScopeRep(Qualifier); 592226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor } 592326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 592426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor Expr *BaseE = (Expr *)Base.get(); 592526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor QualType BaseType = BaseE->getType(); 5926a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (BaseE->isTypeDependent() || Destroyed.getIdentifier() || 592726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor (!isArrow && !BaseType->getAs<RecordType>()) || 592826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor (isArrow && BaseType->getAs<PointerType>() && 5929bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif !BaseType->getAs<PointerType>()->getPointeeType() 5930bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif ->template getAs<RecordType>())){ 593126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // This pseudo-destructor expression is still a pseudo-destructor. 593226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor return SemaRef.BuildPseudoDestructorExpr(move(Base), OperatorLoc, 593326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor isArrow? tok::arrow : tok::period, 5934fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SS, ScopeType, CCLoc, TildeLoc, 5935a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed, 593626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*FIXME?*/true); 593726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor } 593826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 5939a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 594026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor DeclarationName Name 594126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 594226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType->getType())); 594326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 594426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // FIXME: the ScopeType should be tacked onto SS. 594526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 594626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor return getSema().BuildMemberReferenceExpr(move(Base), BaseType, 594726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor OperatorLoc, isArrow, 594826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS, /*FIXME: FirstQualifier*/ 0, 5949a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Name, Destroyed.getLocation(), 595026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*TemplateArgs*/ 0); 595126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor} 595226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 5953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 5954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 5956