TreeTransform.h revision 944cdae86ecb2ab5deda96804099bd28f6a6cd39
157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner//===------- 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. 757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner//===----------------------------------------------------------------------===// 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// 1257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner//===----------------------------------------------------------------------===// 1357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H 15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H 16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 172d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h" 18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 198491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor#include "clang/Sema/ParsedTemplate.h" 20dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h" 21781472fe99a120098c631b0cbe33c89f8cef5e70John McCall#include "clang/Sema/ScopeInfo.h" 22c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h" 237cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h" 24657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h" 25b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h" 26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h" 2743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h" 2843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h" 2943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h" 3019510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Ownership.h" 3119510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h" 32b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h" 33a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h" 347e44e3fcd75147f229f42e6912898ce62d6b4d08Douglas Gregor#include "TypeLocBuilder.h" 35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm> 36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang { 38781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema; 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one 41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another. 42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template 46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the 47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the 48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar 49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and 50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters. 51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can 54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an 55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The 56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual. 57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which 59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node 60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions, 61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST 62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation 63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g., 64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes 65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create 66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node. 67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The 69670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(), 709151c11836f5fbb36cedfe4d22df7e00e77a1d42Douglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely 72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations. 73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the 75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 7643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template 79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX 80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change. 81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild 82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may 83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps. 84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one 861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation 87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the 89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking 90577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()). 91577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 92577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform { 93d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// \brief Private RAII object that helps us forget and then re-remember 94d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// the template argument corresponding to a partially-substituted parameter 95d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// pack. 96d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor class ForgetPartiallySubstitutedPackRAII { 97d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor Derived &Self; 98d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor TemplateArgument Old; 99d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 100d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor public: 101d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 102d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor Old = Self.ForgetPartiallySubstitutedPack(); 103d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor } 104d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 105d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ~ForgetPartiallySubstitutedPackRAII() { 106d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor Self.RememberPartiallySubstitutedPack(Old); 107d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor } 108d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor }; 109d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected: 111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &SemaRef; 1128491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Initializes a new tree transformer. 115b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Derived &getDerived() { return static_cast<Derived&>(*this); } 119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Derived &getDerived() const { 1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return static_cast<const Derived&>(*this); 123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 12560d7b3a319d84d688752be3870615ac0f111fb16John McCall static inline ExprResult Owned(Expr *E) { return E; } 12660d7b3a319d84d688752be3870615ac0f111fb16John McCall static inline StmtResult Owned(Stmt *S) { return S; } 1279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall 128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the semantic analysis object used for 129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this tree transform. 130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &getSema() const { return SemaRef; } 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Whether the transformation should always rebuild AST nodes, even 133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// if none of the children have changed. 134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function to specify when the transformation 136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// should rebuild all AST nodes. 137577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlwaysRebuild() { return false; } 1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 139577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the location of the entity being transformed, if that 140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 141577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, returns no source-location information. Subclasses can 143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// provide an alternative implementation that provides better location 144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information. 145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation getBaseLocation() { return SourceLocation(); } 1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the name of the entity being transformed, if that 148577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns an empty name. Subclasses can provide an alternative 151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// implementation with a more precise name. 152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor DeclarationName getBaseEntity() { return DeclarationName(); } 153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Sets the "base" location and entity when that 155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// information is known based on another transformation. 156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, the source location and entity are ignored. Subclasses can 158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// override this function to provide a customized implementation. 159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor void setBase(SourceLocation Loc, DeclarationName Entity) { } 1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief RAII object that temporarily sets the base location and entity 162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// used for reporting diagnostics in types. 163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor class TemporaryBase { 164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TreeTransform &Self; 165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OldLocation; 166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OldEntity; 1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor public: 169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase(TreeTransform &Self, SourceLocation Location, 1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Entity) : Self(Self) { 171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldLocation = Self.getDerived().getBaseLocation(); 172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldEntity = Self.getDerived().getBaseEntity(); 173ae201f75e56f33278b2d48396b35bfa74c32af63Douglas Gregor 174ae201f75e56f33278b2d48396b35bfa74c32af63Douglas Gregor if (Location.isValid()) 175ae201f75e56f33278b2d48396b35bfa74c32af63Douglas Gregor Self.getDerived().setBase(Location, Entity); 176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ~TemporaryBase() { 179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(OldLocation, OldEntity); 180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor }; 1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determine whether the given type \p T has already been 184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformed. 185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses can provide an alternative implementation of this routine 1871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// to short-circuit evaluation when it is known that a given type will 188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not change. For example, template instantiation need not traverse 189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// non-dependent types. 190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlreadyTransformed(QualType T) { 191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.isNull(); 192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1946eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// \brief Determine whether the given call argument should be dropped, e.g., 1956eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// because it is a default argument. 1966eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// 1976eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// Subclasses can provide an alternative implementation of this routine to 1986eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// determine which kinds of call arguments get dropped. By default, 1996eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// CXXDefaultArgument nodes are dropped (prior to transformation). 2006eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor bool DropCallArgument(Expr *E) { 2016eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return E->isDefaultArgument(); 2026eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 203c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2048491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \brief Determine whether we should expand a pack expansion with the 2058491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// given set of parameter packs into separate arguments by repeatedly 2068491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// transforming the pattern. 2078491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 208b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor /// By default, the transformer never tries to expand pack expansions. 2098491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// Subclasses can override this routine to provide different behavior. 2108491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 2118491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \param EllipsisLoc The location of the ellipsis that identifies the 2128491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// pack expansion. 2138491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 2148491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \param PatternRange The source range that covers the entire pattern of 2158491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// the pack expansion. 2168491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 2178491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \param Unexpanded The set of unexpanded parameter packs within the 2188491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// pattern. 2198491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 2208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \param NumUnexpanded The number of unexpanded parameter packs in 2218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \p Unexpanded. 2228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 2238491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \param ShouldExpand Will be set to \c true if the transformer should 2248491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// expand the corresponding pack expansions into separate arguments. When 2258491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// set, \c NumExpansions must also be set. 2268491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 227d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// \param RetainExpansion Whether the caller should add an unexpanded 228d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// pack expansion after all of the expanded arguments. This is used 229d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// when extending explicitly-specified template argument packs per 230d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// C++0x [temp.arg.explicit]p9. 231d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// 2328491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \param NumExpansions The number of separate arguments that will be in 233cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor /// the expanded form of the corresponding pack expansion. This is both an 234cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor /// input and an output parameter, which can be set by the caller if the 235cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor /// number of expansions is known a priori (e.g., due to a prior substitution) 236cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor /// and will be set by the callee when the number of expansions is known. 237cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor /// The callee must set this value when \c ShouldExpand is \c true; it may 238cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor /// set this value in other cases. 2398491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 2408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \returns true if an error occurred (e.g., because the parameter packs 2418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// are to be instantiated with arguments of different lengths), false 2428491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 2438491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// must be set. 2448491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 2458491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor SourceRange PatternRange, 2468491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor const UnexpandedParameterPack *Unexpanded, 2478491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor unsigned NumUnexpanded, 2488491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor bool &ShouldExpand, 249d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool &RetainExpansion, 250cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> &NumExpansions) { 2518491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ShouldExpand = false; 2528491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return false; 2538491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 2548491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 255d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// \brief "Forget" about the partially-substituted pack template argument, 256d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// when performing an instantiation that must preserve the parameter pack 257d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// use. 258d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// 259d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// This routine is meant to be overridden by the template instantiator. 260d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor TemplateArgument ForgetPartiallySubstitutedPack() { 261d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor return TemplateArgument(); 262d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor } 263d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 264d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// \brief "Remember" the partially-substituted pack template argument 265d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// after performing an instantiation that must preserve the parameter pack 266d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// use. 267d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// 268d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor /// This routine is meant to be overridden by the template instantiator. 269d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 270d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 27112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor /// \brief Note to the derived class when a function parameter pack is 27212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor /// being expanded. 27312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 27412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor 275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transforms the given type into another type. 276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by creating a 278a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall /// TypeSourceInfo for it and delegating to the appropriate 279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// function. This is expensive, but we don't mind, because 280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// this method is deprecated anyway; all users should be 281a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall /// switched to storing TypeSourceInfos. 282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \returns the transformed type. 28443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType TransformType(QualType T); 2851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transforms the given type-with-location into a new 287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type-with-location. 288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// 289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by delegating to the 290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// appropriate TransformXXXType to build a new type. Subclasses 291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// may override this function (to take over all type 292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// transformations) or some set of the TransformXXXType functions 293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// to alter the transformation. 29443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeSourceInfo *TransformType(TypeSourceInfo *DI); 295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transform the given type-with-location into a new 297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type, collecting location information in the given builder 298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// as necessary. 299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 30043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this routine transforms a statement by delegating to the 30543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// appropriate TransformXXXStmt function to transform a specific kind of 30643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// statement or the TransformExpr() function to transform an expression. 30743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to transform statements using some 30843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// other mechanism. 30943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 31043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \returns the transformed statement. 31160d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TransformStmt(Stmt *S); 3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 314657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 32160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult TransformExpr(Expr *E); 3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \brief Transform the given list of expressions. 324aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// 325aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// This routine transforms a list of expressions by invoking 326aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \c TransformExpr() for each subexpression. However, it also provides 327aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// support for variadic templates by expanding any pack expansions (if the 328aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// derived class permits such expansion) along the way. When pack expansions 329aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// are present, the number of outputs may not equal the number of inputs. 330aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// 331aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \param Inputs The set of expressions to be transformed. 332aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// 333aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \param NumInputs The number of expressions in \c Inputs. 334aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// 335aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \param IsCall If \c true, then this transform is being performed on 336aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// function-call arguments, and any arguments that should be dropped, will 337aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// be. 338aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// 339aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \param Outputs The transformed input expressions will be added to this 340aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// vector. 341aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// 342aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 343aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// due to transformation. 344aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// 345aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \returns true if an error occurred, false otherwise. 346aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall, 347aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor llvm::SmallVectorImpl<Expr *> &Outputs, 348aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor bool *ArgChanged = 0); 349aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 353dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 354dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 3557c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; } 35643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 35743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Transform the definition of the given declaration. 35843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, invokes TransformDecl() to transform the declaration. 36043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 361c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 362c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getDerived().TransformDecl(Loc, D); 3637c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor } 3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3656cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// \brief Transform the given declaration, which was the first part of a 3666cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// nested-name-specifier in a member access expression. 3676cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 368c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// This specific declaration transformation only applies to the first 3696cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// identifier in a nested-name-specifier of a member access expression, e.g., 3706cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// the \c T in \c x->T::member 3716cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 3726cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// By default, invokes TransformDecl() to transform the declaration. 3736cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// Subclasses may override this function to provide alternate behavior. 374c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 375c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 3766cd219879ffce00920189ec1dcea927a42602961Douglas Gregor } 377c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 378c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// \brief Transform the given nested-name-specifier with source-location 379c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// information. 380c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// 381c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// By default, transforms all of the types and declarations within the 382c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 383c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// alternate behavior. 384c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc TransformNestedNameSpecifierLoc( 385c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc NNS, 386c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType ObjectType = QualType(), 387c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 388c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 38981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 39081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 39181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 39281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 39381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 39481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 3952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo 39643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 400fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param SS The nested-name-specifier that qualifies the template 401fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// name. This nested-name-specifier must already have been transformed. 402fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 403fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param Name The template name to transform. 404fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 405fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param NameLoc The source location of the template name. 406fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 407fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param ObjectType If we're translating a template name within a member 408fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// access expression, this is the type of the object whose member template 409fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// is being referenced. 410fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 411fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param FirstQualifierInScope If the first part of a nested-name-specifier 412fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// also refers to a name within the current (lexical) scope, this is the 413fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// declaration it refers to. 414fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 415fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// By default, transforms the template name by transforming the declarations 416fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// and nested-name-specifiers that occur within the template name. 417fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 418fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName TransformTemplateName(CXXScopeSpec &SS, 419fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName Name, 420fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 421fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor QualType ObjectType = QualType(), 422fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 423fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this operation transforms the type, expression, or 4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// declaration stored within the template argument and constructs a 428670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 429670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 430833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// 431833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// Returns true if there was an error. 432833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 433833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output); 434833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 435fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// \brief Transform the given set of template arguments. 436fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 437fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// By default, this operation transforms all of the template arguments 438fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// in the input set using \c TransformTemplateArgument(), and appends 439fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// the transformed arguments to the output list. 440fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 4417ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// Note that this overload of \c TransformTemplateArguments() is merely 4427ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// a convenience function. Subclasses that wish to override this behavior 4437ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// should override the iterator-based member template version. 4447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// 445fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// \param Inputs The set of template arguments to be transformed. 446fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 447fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// \param NumInputs The number of template arguments in \p Inputs. 448fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 449fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// \param Outputs The set of transformed template arguments output by this 450fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// routine. 451fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 452fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// Returns true if an error occurred. 453fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 454fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor unsigned NumInputs, 4557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentListInfo &Outputs) { 4567ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs); 4577ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 4587f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 4597f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// \brief Transform the given set of template arguments. 4607f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// 4617f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// By default, this operation transforms all of the template arguments 4627f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// in the input set using \c TransformTemplateArgument(), and appends 4637f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// the transformed arguments to the output list. 4647f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// 4657ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// \param First An iterator to the first template argument. 4667ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// 4677ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// \param Last An iterator one step past the last template argument. 4687f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// 4697f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// \param Outputs The set of transformed template arguments output by this 4707f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// routine. 4717f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// 4727f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// Returns true if an error occurred. 4737ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor template<typename InputIterator> 4747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor bool TransformTemplateArguments(InputIterator First, 4757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor InputIterator Last, 4767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentListInfo &Outputs); 4777f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 478833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 479833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall void InventTemplateArgumentLoc(const TemplateArgument &Arg, 480833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &ArgLoc); 481833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 482a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall /// \brief Fakes up a TypeSourceInfo for a type. 483a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *InventTypeSourceInfo(QualType T) { 484a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return SemaRef.Context.getTrivialTypeSourceInfo(T, 485833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().getBaseLocation()); 486833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 49043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 49343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType 49443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TransformTemplateSpecializationType(TypeLocBuilder &TLB, 49543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateSpecializationTypeLoc TL, 49643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateName Template); 49743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 49843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType 49943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 50043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentTemplateSpecializationTypeLoc TL, 501087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor TemplateName Template, 502087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor CXXScopeSpec &SS); 503a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 504a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor QualType 505a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 50694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor DependentTemplateSpecializationTypeLoc TL, 50794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLoc QualifierLoc); 50894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 50921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// \brief Transforms the parameters of a function type into the 51021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// given vectors. 51121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// 51221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// The result vectors should be kept in sync; null entries in the 51321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// variables vector are acceptable. 51421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// 51521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// Return true on error. 516a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor bool TransformFunctionTypeParams(SourceLocation Loc, 517a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor ParmVarDecl **Params, unsigned NumParams, 518a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor const QualType *ParamTypes, 51921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVectorImpl<QualType> &PTypes, 520a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl*> *PVars); 52121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 52221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// \brief Transforms a single function-type parameter. Return null 52321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// on error. 5246a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 5256a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor llvm::Optional<unsigned> NumExpansions); 52621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 52743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 528833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 52960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 53060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 53360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Transform##Node(Node *S); 534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 53560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Transform##Node(Node *E); 5367381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt) 5374bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 5381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 54385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 54985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 55185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \brief Build a new reference type given the type it references. 552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 55385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// By default, performs semantic analysis when building the 55485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// reference type. Subclasses may override this routine to provide 55585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// different behavior. 556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 55785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \param LValue whether the type was written with an lvalue sigil 55885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// or an rvalue sigil. 55985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildReferenceType(QualType ReferentType, 56085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool LValue, 56185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 5621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 56885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 56985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 5771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 5841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 5901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 59385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 59485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 60385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 60485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 6139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 6249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 634e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::VectorKind VecKind); 6351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 6509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 660fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman bool Variadic, unsigned Quals, 661c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor RefQualifierKind RefQualifier, 662fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman const FunctionType::ExtInfo &Info); 6631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 665a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 667ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// \brief Rebuild an unresolved typename type, given the decl that 668ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// the UnresolvedUsingTypenameDecl was transformed to. 669ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType RebuildUnresolvedUsingType(Decl *D); 670ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 6857da2431c23ef1ee8acb114e39692246e1801afc2John McCall 6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 687577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 688577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6902a984cad5ac3fdceeff2bd99daa7b90979313475John McCall QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 691577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 693577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 694577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 699577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7012a984cad5ac3fdceeff2bd99daa7b90979313475John McCall QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 7021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70334b41d939a1328f484511c6002ba2456db879a29Richard Smith /// \brief Build a new C++0x auto type. 70434b41d939a1328f484511c6002ba2456db879a29Richard Smith /// 70534b41d939a1328f484511c6002ba2456db879a29Richard Smith /// By default, builds a new AutoType with the given deduced type. 70634b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType RebuildAutoType(QualType Deduced) { 70734b41d939a1328f484511c6002ba2456db879a29Richard Smith return SemaRef.Context.getAutoType(Deduced); 70834b41d939a1328f484511c6002ba2456db879a29Richard Smith } 70934b41d939a1328f484511c6002ba2456db879a29Richard Smith 710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 716833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateLoc, 71767714230a191bc3c01f33378f34f34ef377991a6Douglas Gregor TemplateArgumentListInfo &Args); 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 719075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /// \brief Build a new parenthesized type. 720075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /// 721075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /// By default, builds a new ParenType type from the inner type. 722075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /// Subclasses may override this routine to provide different behavior. 723075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType RebuildParenType(QualType InnerType) { 724075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return SemaRef.Context.getParenType(InnerType); 725075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara } 726075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 727577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 728577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 729465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara /// By default, builds a new ElaboratedType type from the keyword, 730465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara /// the nested-name-specifier and the named type. 731465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara /// Subclasses may override this routine to provide different behavior. 73221e413fe6305a198564d436ac515497716c47844John McCall QualType RebuildElaboratedType(SourceLocation KeywordLoc, 73321e413fe6305a198564d436ac515497716c47844John McCall ElaboratedTypeKeyword Keyword, 7349e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 7359e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualType Named) { 7369e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor return SemaRef.Context.getElaboratedType(Keyword, 7379e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 7389e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor Named); 7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 740577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 742577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 743e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara /// By default, builds a new DependentNameType type from the 744e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara /// nested-name-specifier and the given type. Subclasses may override 745e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara /// this routine to provide different behavior. 74633500955d731c73717af52088b7fc0e7a85681e7John McCall QualType RebuildDependentTemplateSpecializationType( 74794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor ElaboratedTypeKeyword Keyword, 74894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 74994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor const IdentifierInfo *Name, 75094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor SourceLocation NameLoc, 75167714230a191bc3c01f33378f34f34ef377991a6Douglas Gregor TemplateArgumentListInfo &Args) { 75294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // Rebuild the template name. 75394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // TODO: avoid TemplateName abstraction 754fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor CXXScopeSpec SS; 755fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.Adopt(QualifierLoc); 75694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TemplateName InstName 757fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 0); 75894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 75994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (InstName.isNull()) 76094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return QualType(); 76194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 76294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // If it's still dependent, make a dependent specialization. 76394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (InstName.getAsDependentTemplateName()) 76494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 76594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 76694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor Name, 76794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor Args); 76894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 76994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // Otherwise, make an elaborated type wrapping a non-dependent 77094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // specialization. 77194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualType T = 77294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 77394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (T.isNull()) return QualType(); 77494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 77594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == 0) 77694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return T; 77794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 77894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return SemaRef.Context.getElaboratedType(Keyword, 77994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 78094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor T); 78194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } 78294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 783577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 785577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 786e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara /// (or elaborated type). Subclasses may override this routine to provide 787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 788e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 789e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara SourceLocation KeywordLoc, 7902494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 7912494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor const IdentifierInfo *Id, 792e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara SourceLocation IdLoc) { 7934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor CXXScopeSpec SS; 7942494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor SS.Adopt(QualifierLoc); 795e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara 7962494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 7974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // If the name is still dependent, just build a new dependent name type. 7984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!SemaRef.computeDeclContext(SS)) 7992494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor return SemaRef.Context.getDependentNameType(Keyword, 8002494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 8012494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor Id); 8024033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 8034033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 804465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (Keyword == ETK_None || Keyword == ETK_Typename) 8052494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 806e29425bd22fbb9200bbec7b743197b9c6dad3e40Douglas Gregor *Id, IdLoc); 807465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 808465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 809465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 810e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara // We had a dependent elaborated-type-specifier that has been transformed 8114033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // into a non-dependent elaborated-type-specifier. Find the tag we're 8124033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // referring to. 813e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 8144033642464e8ba0982f88f34cffad808d247b393Douglas Gregor DeclContext *DC = SemaRef.computeDeclContext(SS, false); 8154033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!DC) 8164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 8174033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 8185613876991c80a684595fe8de1f039296a0657ffJohn McCall if (SemaRef.RequireCompleteDeclContext(SS, DC)) 8195613876991c80a684595fe8de1f039296a0657ffJohn McCall return QualType(); 8205613876991c80a684595fe8de1f039296a0657ffJohn McCall 8214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor TagDecl *Tag = 0; 8224033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SemaRef.LookupQualifiedName(Result, DC); 8234033642464e8ba0982f88f34cffad808d247b393Douglas Gregor switch (Result.getResultKind()) { 8244033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::NotFound: 8254033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::NotFoundInCurrentInstantiation: 8264033642464e8ba0982f88f34cffad808d247b393Douglas Gregor break; 827c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8284033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::Found: 8294033642464e8ba0982f88f34cffad808d247b393Douglas Gregor Tag = Result.getAsSingle<TagDecl>(); 8304033642464e8ba0982f88f34cffad808d247b393Douglas Gregor break; 831c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8324033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::FoundOverloaded: 8334033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::FoundUnresolvedValue: 8344033642464e8ba0982f88f34cffad808d247b393Douglas Gregor llvm_unreachable("Tag lookup cannot find non-tags"); 8354033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 836c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8374033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::Ambiguous: 8384033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // Let the LookupResult structure handle ambiguities. 8394033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 8404033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 8414033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 8424033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!Tag) { 843446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky // Check where the name exists but isn't a tag type and use that to emit 844446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky // better diagnostics. 845446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 846446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky SemaRef.LookupQualifiedName(Result, DC); 847446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky switch (Result.getResultKind()) { 848446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky case LookupResult::Found: 849446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky case LookupResult::FoundOverloaded: 850446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky case LookupResult::FoundUnresolvedValue: { 851446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 852446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky unsigned Kind = 0; 853446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky if (isa<TypedefDecl>(SomeDecl)) Kind = 1; 854446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 2; 855446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind; 856446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 857446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky break; 858446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky } 859446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky default: 860446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky // FIXME: Would be nice to highlight just the source range. 861446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 862446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky << Kind << Id << DC; 863446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky break; 864446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky } 8654033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 8664033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 867465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 868e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) { 869e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 8704033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 8714033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 8724033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 8734033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 8744033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // Build the elaborated-type-specifier type. 8754033642464e8ba0982f88f34cffad808d247b393Douglas Gregor QualType T = SemaRef.Context.getTypeDeclType(Tag); 8762494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor return SemaRef.Context.getElaboratedType(Keyword, 8772494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 8782494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor T); 879dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8812fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor /// \brief Build a new pack expansion type. 8822fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor /// 8832fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor /// By default, builds a new PackExpansionType type from the given pattern. 8842fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor /// Subclasses may override this routine to provide different behavior. 8852fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor QualType RebuildPackExpansionType(QualType Pattern, 8862fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor SourceRange PatternRange, 887cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor SourceLocation EllipsisLoc, 888cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 889cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 890cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions); 8912fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor } 8922fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 893d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 894d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 895d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 896d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 897d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 898d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 899fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName RebuildTemplateName(CXXScopeSpec &SS, 900d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 901d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 902d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 903d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 904d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 905d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 906d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 907d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 908d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 909d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 910fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName RebuildTemplateName(CXXScopeSpec &SS, 911fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor const IdentifierInfo &Name, 912fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 91343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType, 91443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *FirstQualifierInScope); 9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 916ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// \brief Build a new template name given a nested name specifier and the 917ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// overloaded operator name that is referred to as a template. 918ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// 919ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// By default, performs semantic analysis to determine whether the name can 920ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 921ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// template name. Subclasses may override this routine to provide different 922ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// behavior. 923fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName RebuildTemplateName(CXXScopeSpec &SS, 924ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 925fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 926ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType); 9271aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 9281aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// \brief Build a new template name given a template template parameter pack 9291aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// and the 9301aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// 9311aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 9321aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 9331aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// template name. Subclasses may override this routine to provide different 9341aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// behavior. 9351aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 9361aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor const TemplateArgument &ArgPack) { 9371aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 9381aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 9391aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 94043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 94143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 94243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 94343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 94460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 94543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 94643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 94743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 9489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 94943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 95043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 95143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 95243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 95343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 95443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 95543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 95660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 9579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *LHS, 95843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 9599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *RHS, 96043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 9619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 96243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 96343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 9641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 96543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 96643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 96743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 96843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 96960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 9709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall getSema().ActOnCaseStmtBody(S, Body); 9719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return S; 97243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 9731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 97443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 97543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 97643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 97743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 97860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 97943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 9809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *SubStmt) { 9819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 98243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 98343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 9841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 98643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 98743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 98843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 98957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 99057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner SourceLocation ColonLoc, Stmt *SubStmt) { 99157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 99243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 9931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 99443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 99543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 99643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 99743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 99860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 99957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner VarDecl *CondVar, Stmt *Then, 100057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner SourceLocation ElseLoc, Stmt *Else) { 100144aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else); 100243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 100443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 100543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 100860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 100957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Expr *Cond, VarDecl *CondVar) { 10109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond, 1011d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall CondVar); 101243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 101443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 101543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 101643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 101743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 101860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 101957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Stmt *Switch, Stmt *Body) { 10209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 102143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 102243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 102343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 102443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 102543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 102643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 102757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond, 102857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner VarDecl *CondVar, Stmt *Body) { 10299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body); 103043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 103243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 103343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 103443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 103543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 103660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1037ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner SourceLocation WhileLoc, SourceLocation LParenLoc, 1038ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner Expr *Cond, SourceLocation RParenLoc) { 10399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 10409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond, RParenLoc); 104143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 104243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 104343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 104443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 104543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 104643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1047ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1048ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner Stmt *Init, Sema::FullExprArg Cond, 1049ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner VarDecl *CondVar, Sema::FullExprArg Inc, 1050ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner SourceLocation RParenLoc, Stmt *Body) { 10519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1052ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner CondVar, Inc, RParenLoc, Body); 105343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 105543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 105643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 105743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 105843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1059ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1060ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner LabelDecl *Label) { 106157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 106243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 106343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 106443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 106543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 106643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 106743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 106860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1069ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner SourceLocation StarLoc, 1070ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner Expr *Target) { 10719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 107243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 107443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 107543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 107643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 107743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1078ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 10799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnReturnStmt(ReturnLoc, Result); 108043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 108243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 108343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 108443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 108543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 108660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 108843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 1089406c38e8c1f105acfd438f94dfbc17af817aa4a5Richard Smith Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls, NumDecls); 1090406c38e8c1f105acfd438f94dfbc17af817aa4a5Richard Smith return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 109143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1093703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// \brief Build a new inline asm statement. 1094703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// 1095703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// By default, performs semantic analysis to build the new statement. 1096703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// Subclasses may override this routine to provide different behavior. 109760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildAsmStmt(SourceLocation AsmLoc, 1098703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool IsSimple, 1099703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool IsVolatile, 1100703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson unsigned NumOutputs, 1101703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson unsigned NumInputs, 1102ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson IdentifierInfo **Names, 1103703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Constraints, 1104703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Exprs, 11059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *AsmString, 1106703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Clobbers, 1107703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson SourceLocation RParenLoc, 1108703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool MSAsm) { 1109c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1110703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson NumInputs, Names, move(Constraints), 11119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Exprs, AsmString, Clobbers, 1112703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson RParenLoc, MSAsm); 1113703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 11144dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 11154dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// \brief Build a new Objective-C @try statement. 11164dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// 11174dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// By default, performs semantic analysis to build the new statement. 11184dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 111960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 11209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *TryBody, 11218f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor MultiStmtArg CatchStmts, 11229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *Finally) { 11239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts), 11249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Finally); 11254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 11264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 1127be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// \brief Rebuild an Objective-C exception declaration. 1128be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// 1129be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// By default, performs semantic analysis to build the new declaration. 1130be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1131be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1132be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TypeSourceInfo *TInfo, QualType T) { 1133c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getSema().BuildObjCExceptionDecl(TInfo, T, 1134c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ExceptionDecl->getIdentifier(), 1135be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor ExceptionDecl->getLocation()); 1136be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 1137c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1138be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// \brief Build a new Objective-C @catch statement. 1139be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// 1140be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// By default, performs semantic analysis to build the new statement. 1141be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 114260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1143be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor SourceLocation RParenLoc, 1144be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *Var, 11459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *Body) { 1146be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 11479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Var, Body); 1148be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 1149c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 11504dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// \brief Build a new Objective-C @finally statement. 11514dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// 11524dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// By default, performs semantic analysis to build the new statement. 11534dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 115460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 11559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *Body) { 11569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 11574dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 1158c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 11598fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// \brief Build a new Objective-C @throw statement. 1160d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// 1161d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// By default, performs semantic analysis to build the new statement. 1162d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// Subclasses may override this routine to provide different behavior. 116360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 11649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Operand) { 11659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1166d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor } 1167c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 11688fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// \brief Build a new Objective-C @synchronized statement. 11698fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// 11708fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// By default, performs semantic analysis to build the new statement. 11718fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// Subclasses may override this routine to provide different behavior. 117260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 11739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Object, 11749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *Body) { 11759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, 11769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body); 11778fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor } 1178c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor 1179c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// \brief Build a new Objective-C fast enumeration statement. 1180c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// 1181c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// By default, performs semantic analysis to build the new statement. 1182c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 118360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1184f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation LParenLoc, 1185f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Stmt *Element, 1186f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Expr *Collection, 1187f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation RParenLoc, 1188f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Stmt *Body) { 1189c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc, 11909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Element, 11919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Collection, 1192c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor RParenLoc, 11939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body); 1194c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor } 1195c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 119643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 119743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 119843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 119943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 120083cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1201a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *Declarator, 120243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 120383cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor SourceLocation Loc) { 120483cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor return getSema().BuildExceptionDeclaration(0, Declarator, Name, Loc); 120543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 120643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 120743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 120843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 120943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 121043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 121160d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 1212f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall VarDecl *ExceptionDecl, 1213f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Stmt *Handler) { 12149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 12159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Handler)); 121643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 121843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 121943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 122043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 122143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 122260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 1223f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Stmt *TryBlock, 1224f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiStmtArg Handlers) { 12259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers)); 122643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 123260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 1233f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall LookupResult &R, 1234f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall bool RequiresADL) { 1235f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 1236f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 1237f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1238f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1239f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// \brief Build a new expression that references a declaration. 1240f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// 1241f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// By default, performs semantic analysis to build the new expression. 1242f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Subclasses may override this routine to provide different behavior. 124340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 1244f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall ValueDecl *VD, 1245f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall const DeclarationNameInfo &NameInfo, 1246f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TemplateArgumentListInfo *TemplateArgs) { 1247a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 124840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor SS.Adopt(QualifierLoc); 1249dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 1250dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: loses template args. 12512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 12522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 125960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 12619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1264a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 12651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1266a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1267a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 126860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 1269f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SourceLocation OperatorLoc, 1270f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor bool isArrow, 1271f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor CXXScopeSpec &SS, 1272f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor TypeSourceInfo *ScopeType, 1273f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SourceLocation CCLoc, 1274f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SourceLocation TildeLoc, 1275a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed); 12761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 12781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 128160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 12822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall UnaryOperatorKind Opc, 12839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr) { 12849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr); 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Build a new builtin offsetof expression. 12888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// 12898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// By default, performs semantic analysis to build the new expression. 12908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// Subclasses may override this routine to provide different behavior. 129160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 12928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *Type, 1293f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::OffsetOfComponent *Components, 12948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned NumComponents, 12958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RParenLoc) { 12968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 12978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor NumComponents, RParenLoc); 12988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1299c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 13011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 130460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo, 13055ab75172051a6d2ea71a80a79e81c65519fd3462John McCall SourceLocation OpLoc, 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 1307a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R); 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 13101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 131560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildSizeOfAlignOf(Expr *SubExpr, SourceLocation OpLoc, 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 131760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 13189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall = getSema().CreateSizeOfAlignOfExpr(SubExpr, OpLoc, isSizeOf, R); 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1320f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 132960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildArraySubscriptExpr(Expr *LHS, 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 13319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *RHS, 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 13339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS, 13349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LBracketLoc, RHS, 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 13391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 134260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1344e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne SourceLocation RParenLoc, 1345e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne Expr *ExecConfig = 0) { 13469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc, 1347e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne move(Args), RParenLoc, ExecConfig); 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 13511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 135460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 1355f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall bool isArrow, 135640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 1357f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall const DeclarationNameInfo &MemberNameInfo, 1358f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ValueDecl *Member, 1359f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall NamedDecl *FoundDecl, 1360d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *ExplicitTemplateArgs, 1361f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall NamedDecl *FirstQualifierInScope) { 1362d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 1363f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall // We have a reference to an unnamed field. This is always the 1364f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall // base of an anonymous struct/union member access, i.e. the 1365f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall // field is always of record type. 136640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!"); 1367f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall assert(Member->getType()->isRecordType() && 1368f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall "unnamed member not of record type?"); 13691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 137040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (getSema().PerformObjectMemberConversion(Base, 137140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc.getNestedNameSpecifier(), 13726bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl, Member)) 1373f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 13748aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor 1375f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); 13761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 13779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall new (getSema().Context) MemberExpr(Base, isArrow, 13782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Member, MemberNameInfo, 1379f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall cast<FieldDecl>(Member)->getType(), 1380f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall VK, OK_Ordinary); 1381d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 1382d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 13831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 138483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 138540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor SS.Adopt(QualifierLoc); 138683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 13879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall getSema().DefaultFunctionArrayConversion(Base); 13889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall QualType BaseType = Base->getType(); 1389aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 13906bb8017bb9e828d118e15e59d71c66bba323c364John McCall // FIXME: this involves duplicating earlier analysis in a lot of 13916bb8017bb9e828d118e15e59d71c66bba323c364John McCall // cases; we should avoid this when possible. 13922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 13936bb8017bb9e828d118e15e59d71c66bba323c364John McCall R.addDecl(FoundDecl); 1394c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R.resolveKind(); 1395c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 13969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 1397129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 1398c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, ExplicitTemplateArgs); 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 140560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 14062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall BinaryOperatorKind Opc, 14079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *LHS, Expr *RHS) { 14089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS); 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 14121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 141560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildConditionalOperator(Expr *Cond, 141656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation QuestionLoc, 141756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *LHS, 141856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation ColonLoc, 141956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *RHS) { 14209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 14219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS, RHS); 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 14251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 142860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 14299d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 14319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr) { 1432b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 14339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr); 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 14371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 144060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 144142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *TInfo, 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 14439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Init) { 144442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 14459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init); 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 14491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 145260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildExtVectorElementExpr(Expr *Base, 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 1456aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 1457129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall CXXScopeSpec SS; 14582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 14599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 1460129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OpLoc, /*IsArrow*/ false, 1461129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, /*FirstQualifierInScope*/ 0, 14622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 1463129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /* TemplateArgs */ 0); 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 14671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 147060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildInitList(SourceLocation LBraceLoc, 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1472e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor SourceLocation RBraceLoc, 1473e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor QualType ResultTy) { 147460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 1475e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1476e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor if (Result.isInvalid() || ResultTy->isDependentType()) 1477e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1478c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1479e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // Patch in the result type we were given, which may have been computed 1480e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // when the initial InitListExpr was built. 1481e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1482e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor ILE->setType(ResultTy); 1483e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 14871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 149060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildDesignatedInitExpr(Designation &Desig, 1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 14949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Init) { 149560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 14979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init); 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1499f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 15001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 15061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 151060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildImplicitValueInitExpr(QualType T) { 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 15151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 151860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 15199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, TypeSourceInfo *TInfo, 15202cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara SourceLocation RParenLoc) { 15212cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara return getSema().BuildVAArgExpr(BuiltinLoc, 15229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, TInfo, 15232cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara RParenLoc); 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 15271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 153060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1533c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc, 1534f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian move(SubExprs)); 1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 15391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 154260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1543ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner SourceLocation LabelLoc, LabelDecl *Label) { 154457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 15481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 155160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 15529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *SubStmt, 1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 15549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 156160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 15629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Cond, Expr *LHS, Expr *RHS, 1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 15659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond, LHS, RHS, 1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 15741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 157760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 15799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Callee, 15809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *First, 15819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Second); 15821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 158960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 15929d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 15959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 15999d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 16001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 16019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, RParenLoc); 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 16049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 16069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, RParenLoc); 16071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 16099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 16101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 16119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 16131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 16159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 16161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 16179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, RParenLoc); 16181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1624f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 163160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 16339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 16369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1638c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 16399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall TInfo, SubExpr, 1640c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1641c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 164860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 16509d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 16539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1655c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 16569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall TInfo, SubExpr, 1657c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1658c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 166560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 16679d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 16709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1672c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 16739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall TInfo, SubExpr, 1674c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1675c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 168260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 16849d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 16879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1689c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 16909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall TInfo, SubExpr, 1691c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1692c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1699ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 1700ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation LParenLoc, 1701ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Expr *Sub, 1702ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation RParenLoc) { 1703ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 1704f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg(&Sub, 1), 1705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 171260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 171357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor SourceLocation TypeidLoc, 171457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *Operand, 1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1716c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 171757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor RParenLoc); 1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 172001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 1721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 172560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 172657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor SourceLocation TypeidLoc, 17279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Operand, 1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 17299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 173057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor RParenLoc); 17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 173301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// \brief Build a new C++ __uuidof(type) expression. 173401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// 173501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// By default, performs semantic analysis to build the new expression. 173601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// Subclasses may override this routine to provide different behavior. 173701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 173801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceLocation TypeidLoc, 173901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TypeSourceInfo *Operand, 174001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceLocation RParenLoc) { 174101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 174201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet RParenLoc); 174301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 174401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 174501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// \brief Build a new C++ __uuidof(expr) expression. 174601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// 174701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// By default, performs semantic analysis to build the new expression. 174801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// Subclasses may override this routine to provide different behavior. 174901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 175001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceLocation TypeidLoc, 175101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Expr *Operand, 175201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceLocation RParenLoc) { 175301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 175401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet RParenLoc); 175501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 175601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 1757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 176260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1763ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor QualType ThisType, 1764ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor bool isImplicit) { 1765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1766828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, 1767828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor isImplicit)); 1768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 177460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub) { 17759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCXXThrow(ThrowLoc, Sub); 1776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 178360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 1784036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param) { 1785036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc, 1786036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor Param)); 1787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1793ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 1794ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation LParenLoc, 1795ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation RParenLoc) { 1796ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, 17971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1798ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor RParenLoc); 1799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 18001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 180560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 18061bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor bool UseGlobal, 18071bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceLocation PlacementLParen, 18081bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor MultiExprArg PlacementArgs, 18091bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceLocation PlacementRParen, 18101bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceRange TypeIdParens, 18111bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor QualType AllocatedType, 18121bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *AllocatedTypeInfo, 18131bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor Expr *ArraySize, 18141bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceLocation ConstructorLParen, 18151bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor MultiExprArg ConstructorArgs, 18161bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceLocation ConstructorRParen) { 18171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 18214bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor TypeIdParens, 18221bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocatedType, 18231bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocatedTypeInfo, 18249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall ArraySize, 1825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 183460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 18379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Operand) { 1838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 18399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Operand); 1840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 18411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 184660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 18473d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor SourceLocation StartLoc, 18483d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor TypeSourceInfo *T, 18493d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor SourceLocation RParenLoc) { 18503d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor return getSema().BuildUnaryTypeTrait(Trait, StartLoc, T, RParenLoc); 1851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 18536ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet /// \brief Build a new binary type trait expression. 18546ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet /// 18556ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet /// By default, performs semantic analysis to build the new expression. 18566ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet /// Subclasses may override this routine to provide different behavior. 18576ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet ExprResult RebuildBinaryTypeTrait(BinaryTypeTrait Trait, 18586ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet SourceLocation StartLoc, 18596ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *LhsT, 18606ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *RhsT, 18616ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet SourceLocation RParenLoc) { 18626ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc); 18636ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet } 18646ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 18651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 187000cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor ExprResult RebuildDependentScopeDeclRefExpr( 187100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 18722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 1873f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall const TemplateArgumentListInfo *TemplateArgs) { 1874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 187500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor SS.Adopt(QualifierLoc); 1876f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1877f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (TemplateArgs) 18782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo, 1879f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall *TemplateArgs); 1880f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 18812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo); 1882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 188860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 1889f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 1890f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL, 1891d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 1892f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs); 1893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 189960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXConstructExpr(QualType T, 19004411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor SourceLocation Loc, 1901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 19038c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor MultiExprArg Args, 19048c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor bool RequiresZeroInit, 1905428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::ConstructionKind ConstructKind, 1906428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange ParenRange) { 1907ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConvertedArgs(SemaRef); 1908c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, 19094411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ConvertedArgs)) 1910f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 1911c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 19124411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 19138c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor move_arg(ConvertedArgs), 1914428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth RequiresZeroInit, ConstructKind, 1915428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ParenRange); 1916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1922ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 1923ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation LParenLoc, 1924ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor MultiExprArg Args, 1925ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation RParenLoc) { 1926ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getSema().BuildCXXTypeConstructExpr(TSInfo, 1927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1936ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 1937ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation LParenLoc, 1938ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor MultiExprArg Args, 1939ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation RParenLoc) { 1940ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getSema().BuildCXXTypeConstructExpr(TSInfo, 1941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 19451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 195060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 19517c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualType BaseType, 19527c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor bool IsArrow, 19537c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor SourceLocation OperatorLoc, 19547c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 1955129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NamedDecl *FirstQualifierInScope, 19562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &MemberNameInfo, 1957129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 1958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 19597c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor SS.Adopt(QualifierLoc); 19601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 1962aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1963129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 19642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberNameInfo, 19652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TemplateArgs); 1966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1968129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Build a new member reference expression. 19693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 19703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 19713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 197260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, 1973aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 1974129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 1975129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool IsArrow, 19764c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 1977c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope, 1978129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult &R, 1979129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 19803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 19814c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor SS.Adopt(QualifierLoc); 19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 1984aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 1985c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall SS, FirstQualifierInScope, 1986c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, TemplateArgs); 19873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 19881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19892e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl /// \brief Build a new noexcept expression. 19902e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl /// 19912e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl /// By default, performs semantic analysis to build the new expression. 19922e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl /// Subclasses may override this routine to provide different behavior. 19932e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 19942e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 19952e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl } 19962e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 1997ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Build a new expression to compute the length of a parameter pack. 1998ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 1999ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation PackLoc, 2000ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation RParenLoc, 2001ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor unsigned Length) { 2002ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 2003ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor OperatorLoc, Pack, PackLoc, 2004ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor RParenLoc, Length); 2005ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor } 2006ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 2007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 2008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 2009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 2010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 201160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 201281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodeTypeInfo, 2013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 201481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, 2015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 20161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 2017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 201892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /// \brief Build a new Objective-C class message. 201960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 202092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Selector Sel, 2021f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelectorLoc, 202292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ObjCMethodDecl *Method, 2023c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt SourceLocation LBracLoc, 202492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor MultiExprArg Args, 202592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor SourceLocation RBracLoc) { 202692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.BuildClassMessage(ReceiverTypeInfo, 202792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverTypeInfo->getType(), 202892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /*SuperLoc=*/SourceLocation(), 2029f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis Sel, Method, LBracLoc, SelectorLoc, 2030f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis RBracLoc, move(Args)); 203192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 203292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 203392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /// \brief Build a new Objective-C instance message. 203460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCMessageExpr(Expr *Receiver, 203592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Selector Sel, 2036f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelectorLoc, 203792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ObjCMethodDecl *Method, 2038c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt SourceLocation LBracLoc, 203992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor MultiExprArg Args, 204092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor SourceLocation RBracLoc) { 20419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildInstanceMessage(Receiver, 20429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Receiver->getType(), 204392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /*SuperLoc=*/SourceLocation(), 2044f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis Sel, Method, LBracLoc, SelectorLoc, 2045f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis RBracLoc, move(Args)); 204692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 204792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 2048f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// \brief Build a new Objective-C ivar reference expression. 2049f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// 2050f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// By default, performs semantic analysis to build the new expression. 2051f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// Subclasses may override this routine to provide different behavior. 205260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 2053f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor SourceLocation IvarLoc, 2054f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor bool IsArrow, bool IsFreeIvar) { 2055f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // FIXME: We lose track of the IsFreeIvar bit. 2056f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor CXXScopeSpec SS; 20579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Base = BaseArg; 2058f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc, 2059f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Sema::LookupMemberName); 206060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2061f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FIME:*/IvarLoc, 2062d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SS, 0, 2063ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall false); 2064f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.isInvalid()) 2065f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 2066c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2067f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.get()) 2068f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return move(Result); 2069c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 20709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2071c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /*FIXME:*/IvarLoc, IsArrow, SS, 2072f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FirstQualifierInScope=*/0, 2073c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt R, 2074f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*TemplateArgs=*/0); 2075f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor } 2076e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 2077e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// \brief Build a new Objective-C property reference expression. 2078e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// 2079e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// By default, performs semantic analysis to build the new expression. 2080e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 208160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 2082e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor ObjCPropertyDecl *Property, 2083e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor SourceLocation PropertyLoc) { 2084e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor CXXScopeSpec SS; 20859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Base = BaseArg; 2086e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor LookupResult R(getSema(), Property->getDeclName(), PropertyLoc, 2087e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Sema::LookupMemberName); 2088e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor bool IsArrow = false; 208960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2090e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*FIME:*/PropertyLoc, 2091d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SS, 0, false); 2092e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Result.isInvalid()) 2093f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 2094c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2095e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Result.get()) 2096e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor return move(Result); 2097c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 20989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2099c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /*FIXME:*/PropertyLoc, IsArrow, 2100c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt SS, 2101e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*FirstQualifierInScope=*/0, 2102c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt R, 2103e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*TemplateArgs=*/0); 2104e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor } 2105c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 210612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall /// \brief Build a new Objective-C property reference expression. 21079cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// 21089cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// By default, performs semantic analysis to build the new expression. 210912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall /// Subclasses may override this routine to provide different behavior. 211012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 211112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall ObjCMethodDecl *Getter, 211212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall ObjCMethodDecl *Setter, 211312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall SourceLocation PropertyLoc) { 211412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // Since these expressions can only be value-dependent, we do not 211512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // need to perform semantic analysis again. 211612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return Owned( 211712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 211812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall VK_LValue, OK_ObjCProperty, 211912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall PropertyLoc, Base)); 21209cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor } 21219cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor 2122f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// \brief Build a new Objective-C "isa" expression. 2123f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// 2124f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// By default, performs semantic analysis to build the new expression. 2125f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// Subclasses may override this routine to provide different behavior. 212660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 2127f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor bool IsArrow) { 2128f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor CXXScopeSpec SS; 21299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Base = BaseArg; 2130f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc, 2131f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Sema::LookupMemberName); 213260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2133f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FIME:*/IsaLoc, 2134d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SS, 0, false); 2135f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.isInvalid()) 2136f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 2137c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2138f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.get()) 2139f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return move(Result); 2140c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 21419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2142c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /*FIXME:*/IsaLoc, IsArrow, SS, 2143f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FirstQualifierInScope=*/0, 2144c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt R, 2145f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*TemplateArgs=*/0); 2146f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor } 2147c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 2149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 2150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 2151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 215260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 2153f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall MultiExprArg SubExprs, 2154f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall SourceLocation RParenLoc) { 2155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 21561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 2157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 2158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 2159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 2160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 2163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 2165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 2166f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall VK_LValue, BuiltinLoc); 2167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 21681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 2170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 2171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 2172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 2173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 21745291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor Builtin->getCallResultType(), 2175f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr::getValueKindForType(Builtin->getResultType()), 2176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 217760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult OwnedCall(SemaRef.Owned(TheCall)); 21781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 218060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 2181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 2182f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 21831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 21851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 2186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 218743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 21888491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \brief Build a new template argument pack expansion. 21898491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 21908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// By default, performs semantic analysis to build a new pack expansion 21918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// for a template argument. Subclasses may override this routine to provide 21928491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// different behavior. 21938491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 2194cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor SourceLocation EllipsisLoc, 2195cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 21968491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor switch (Pattern.getArgument().getKind()) { 21977a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor case TemplateArgument::Expression: { 21987a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor ExprResult Result 219967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 220067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor EllipsisLoc, NumExpansions); 22017a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor if (Result.isInvalid()) 22027a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor return TemplateArgumentLoc(); 22037a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor 22047a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor return TemplateArgumentLoc(Result.get(), Result.get()); 22057a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor } 2206dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 22078491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Template: 2208a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgumentLoc(TemplateArgument( 2209a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Pattern.getArgument().getAsTemplate(), 22102be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor NumExpansions), 2211b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Pattern.getTemplateQualifierLoc(), 2212a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Pattern.getTemplateNameLoc(), 2213a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor EllipsisLoc); 22148491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 22158491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Null: 22168491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Integral: 22178491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Declaration: 22188491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Pack: 2219a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 22208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor llvm_unreachable("Pack expansion pattern has no parameter packs"); 22218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 22228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Type: 22238491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (TypeSourceInfo *Expansion 22248491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 2225cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor EllipsisLoc, 2226cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions)) 22278491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 22288491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Expansion); 22298491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor break; 22308491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 22318491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 22328491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return TemplateArgumentLoc(); 22338491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 22348491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 2235dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// \brief Build a new expression pack expansion. 2236dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// 2237dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// By default, performs semantic analysis to build a new pack expansion 2238dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// for an expression. Subclasses may override this routine to provide 2239dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// different behavior. 224067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 224167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor llvm::Optional<unsigned> NumExpansions) { 224267fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 2243dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor } 2244dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 224543fed0de4f5bc189e45562491f83d5193eb8dac0John McCallprivate: 2246c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TypeLoc TransformTypeInObjectScope(TypeLoc TL, 2247c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType ObjectType, 2248c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamedDecl *FirstQualifierInScope, 2249c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor CXXScopeSpec &SS); 2250b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 2251b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 2252b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor QualType ObjectType, 2253b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor NamedDecl *FirstQualifierInScope, 2254b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor CXXScopeSpec &SS); 2255577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 2256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 225743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 225860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 225943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 226043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 226243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 226343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 22641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 226543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 226643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 226743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 226863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node) 226943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 22704bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 22711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 227243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 227343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 22747381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt) 227543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 22764bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 227743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 227860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 227943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 2280f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 22811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take())); 228343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 22841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 22851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22863fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 228743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 22881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2290670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 229160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 2292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 2293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 2294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 2296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 2297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 22987381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt) 2299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 2300454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 23014bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 23021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 23031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23043fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 2305657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 2306657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 2307657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 2308aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorbool TreeTransform<Derived>::TransformExprs(Expr **Inputs, 2309aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor unsigned NumInputs, 2310aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor bool IsCall, 2311aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor llvm::SmallVectorImpl<Expr *> &Outputs, 2312aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor bool *ArgChanged) { 2313aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor for (unsigned I = 0; I != NumInputs; ++I) { 2314aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor // If requested, drop call arguments that need to be dropped. 2315aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 2316aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (ArgChanged) 2317aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor *ArgChanged = true; 2318aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2319aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor break; 2320aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor } 2321aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2322dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 2323dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Expr *Pattern = Expansion->getPattern(); 2324dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2325dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; 2326dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 2327dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 2328dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2329dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // Determine whether the set of unexpanded parameter packs can and should 2330dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // be expanded. 2331dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor bool Expand = true; 2332d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 233367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor llvm::Optional<unsigned> OrigNumExpansions 233467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor = Expansion->getNumExpansions(); 233567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 2336dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 2337dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Pattern->getSourceRange(), 2338dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Unexpanded.data(), 2339dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Unexpanded.size(), 2340d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor Expand, RetainExpansion, 2341d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 2342dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor return true; 2343dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2344dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (!Expand) { 2345dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // The transform has determined that we should perform a simple 2346dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // transformation on the pack expansion, producing another pack 2347dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // expansion. 2348dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 2349dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor ExprResult OutPattern = getDerived().TransformExpr(Pattern); 2350dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (OutPattern.isInvalid()) 2351dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor return true; 2352dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2353dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 235467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor Expansion->getEllipsisLoc(), 235567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor NumExpansions); 2356dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (Out.isInvalid()) 2357dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor return true; 2358dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2359dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (ArgChanged) 2360dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor *ArgChanged = true; 2361dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Outputs.push_back(Out.get()); 2362dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor continue; 2363dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor } 2364dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2365dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // The transform has determined that we should perform an elementwise 2366dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // expansion of the pattern. Do so. 2367cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 2368dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 2369dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor ExprResult Out = getDerived().TransformExpr(Pattern); 2370dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (Out.isInvalid()) 2371dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor return true; 2372dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 237377d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor if (Out.get()->containsUnexpandedParameterPack()) { 237467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(), 237567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor OrigNumExpansions); 237677d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor if (Out.isInvalid()) 237777d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor return true; 237877d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor } 237977d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor 2380dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (ArgChanged) 2381dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor *ArgChanged = true; 2382dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Outputs.push_back(Out.get()); 2383dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor } 2384dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2385dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor continue; 2386dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor } 2387dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2388aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor ExprResult Result = getDerived().TransformExpr(Inputs[I]); 2389aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (Result.isInvalid()) 2390aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return true; 2391aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2392aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (Result.get() != Inputs[I] && ArgChanged) 2393aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor *ArgChanged = true; 2394aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2395aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Outputs.push_back(Result.get()); 2396aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor } 2397aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2398aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return false; 2399aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor} 2400aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2401aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregortemplate<typename Derived> 2402c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc 2403c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorTreeTransform<Derived>::TransformNestedNameSpecifierLoc( 2404c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc NNS, 2405c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType ObjectType, 2406c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamedDecl *FirstQualifierInScope) { 2407c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor llvm::SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 2408c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 2409c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Qualifier = Qualifier.getPrefix()) 2410c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Qualifiers.push_back(Qualifier); 2411c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2412c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor CXXScopeSpec SS; 2413c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor while (!Qualifiers.empty()) { 2414c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 2415c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 2416c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2417c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor switch (QNNS->getKind()) { 2418c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::Identifier: 2419c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0, 2420c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor *QNNS->getAsIdentifier(), 2421c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalBeginLoc(), 2422c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalEndLoc(), 2423c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ObjectType, false, SS, 2424c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor FirstQualifierInScope, false)) 2425c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 2426c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2427c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2428c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2429c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::Namespace: { 2430c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamespaceDecl *NS 2431c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = cast_or_null<NamespaceDecl>( 2432c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor getDerived().TransformDecl( 2433c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalBeginLoc(), 2434c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QNNS->getAsNamespace())); 2435c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 2436c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2437c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 2438c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2439c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::NamespaceAlias: { 2440c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamespaceAliasDecl *Alias 2441c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = cast_or_null<NamespaceAliasDecl>( 2442c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor getDerived().TransformDecl(Q.getLocalBeginLoc(), 2443c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QNNS->getAsNamespaceAlias())); 2444c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 2445c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalEndLoc()); 2446c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2447c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 2448c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2449c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::Global: 2450c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // There is no meaningful transformation that one could perform on the 2451c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // global scope. 2452c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 2453c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2454c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2455c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 2456c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::TypeSpec: { 2457c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 2458c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor FirstQualifierInScope, SS); 2459c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2460c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!TL) 2461c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 2462c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2463c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 2464c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && 2465c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TL.getType()->isEnumeralType())) { 2466c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor assert(!TL.getType().hasLocalQualifiers() && 2467c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor "Can't get cv-qualifiers here"); 2468c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 2469c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalEndLoc()); 2470c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2471c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 2472c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2473c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 2474c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor << TL.getType() << SS.getRange(); 2475c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 2476c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 24777c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor } 2478c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 24797c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor // The qualifier-in-scope and object type only apply to the leftmost entity. 2480c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor FirstQualifierInScope = 0; 24817c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor ObjectType = QualType(); 2482c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 2483c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2484c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // Don't rebuild the nested-name-specifier if we don't have to. 2485c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 2486c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor !getDerived().AlwaysRebuild()) 2487c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NNS; 2488c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2489c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // If we can re-use the source-location data from the original 2490c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // nested-name-specifier, do so. 2491c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (SS.location_size() == NNS.getDataLength() && 2492c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 2493c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 2494c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2495c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // Allocate new nested-name-specifier location information. 2496c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return SS.getWithLocInContext(SemaRef.Context); 2497c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor} 2498c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2499c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename Derived> 25002577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameInfo 25012577743c5650c646fb705df01403707e94f2df04Abramo BagnaraTreeTransform<Derived> 250243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 25032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName Name = NameInfo.getName(); 250481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 25052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(); 250681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 250781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 250881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 250981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 251081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 251181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 251281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 25133e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 251481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 25152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return NameInfo; 25161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 251781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 251881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 251981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 25202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TypeSourceInfo *NewTInfo; 25212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara CanQualType NewCanTy; 25222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 252343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NewTInfo = getDerived().TransformType(OldTInfo); 252443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (!NewTInfo) 252543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return DeclarationNameInfo(); 252643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 25272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 25282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara else { 25292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewTInfo = 0; 25302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 253143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 25322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (NewT.isNull()) 25332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(); 25342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewCanTy = SemaRef.Context.getCanonicalType(NewT); 25352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 25361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName NewName 25382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 25392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewCanTy); 25402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NewNameInfo(NameInfo); 25412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewNameInfo.setName(NewName); 25422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewNameInfo.setNamedTypeInfo(NewTInfo); 25432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return NewNameInfo; 254481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 25451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 25461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara assert(0 && "Unknown name kind."); 25482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(); 254981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 255081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 255181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 25521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 2553fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 2554fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName Name, 2555fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 2556fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor QualType ObjectType, 2557fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor NamedDecl *FirstQualifierInScope) { 2558fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 2559fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateDecl *Template = QTN->getTemplateDecl(); 2560fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor assert(Template && "qualified template name must refer to a template"); 2561fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2562fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateDecl *TransTemplate 2563fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 2564fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor Template)); 2565fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!TransTemplate) 2566fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(); 2567fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2568fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!getDerived().AlwaysRebuild() && 2569fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.getScopeRep() == QTN->getQualifier() && 2570fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TransTemplate == Template) 2571fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return Name; 2572fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2573fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 2574fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TransTemplate); 2575fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2576fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2577fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 2578fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (SS.getScopeRep()) { 2579fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // These apply to the scope specifier, not the template. 2580fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor ObjectType = QualType(); 2581fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor FirstQualifierInScope = 0; 2582fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2583fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2584fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!getDerived().AlwaysRebuild() && 2585fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.getScopeRep() == DTN->getQualifier() && 2586fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor ObjectType.isNull()) 2587fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return Name; 2588fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2589fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (DTN->isIdentifier()) { 2590fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, 2591fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor *DTN->getIdentifier(), 2592fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor NameLoc, 2593fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor ObjectType, 2594fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor FirstQualifierInScope); 2595fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2596fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2597fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 2598fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor ObjectType); 2599fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2600fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2601fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 2602fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateDecl *TransTemplate 2603fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 2604fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor Template)); 2605fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!TransTemplate) 2606fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(); 2607fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2608fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!getDerived().AlwaysRebuild() && 2609fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TransTemplate == Template) 2610fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return Name; 2611fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2612fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(TransTemplate); 2613fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2614fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2615fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (SubstTemplateTemplateParmPackStorage *SubstPack 2616fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = Name.getAsSubstTemplateTemplateParmPack()) { 2617fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateTemplateParmDecl *TransParam 2618fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = cast_or_null<TemplateTemplateParmDecl>( 2619fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 2620fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!TransParam) 2621fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(); 2622fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2623fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!getDerived().AlwaysRebuild() && 2624fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TransParam == SubstPack->getParameterPack()) 2625fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return Name; 2626fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2627fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(TransParam, 2628fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SubstPack->getArgumentPack()); 2629fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2630fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2631fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // These should be getting filtered out before they reach the AST. 2632fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor llvm_unreachable("overloaded function decl survived to here"); 2633fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(); 2634fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor} 2635fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2636fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregortemplate<typename Derived> 2637833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 2638833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 2639833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 2640833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 2641670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 2642670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 26439f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("null template argument in TreeTransform"); 2644833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2645833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2646833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 2647833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 2648a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 2649c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2650833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2651833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2652788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 2653b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor case TemplateArgument::TemplateExpansion: { 2654b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor NestedNameSpecifierLocBuilder Builder; 2655b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor TemplateName Template = Arg.getAsTemplate(); 2656b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 2657b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 2658b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 2659b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 2660b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 2661b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (Arg.getKind() == TemplateArgument::Template) 2662b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Output = TemplateArgumentLoc(Arg, 2663b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Builder.getWithLocInContext(SemaRef.Context), 2664b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Loc); 2665b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor else 2666b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Output = TemplateArgumentLoc(Arg, 2667b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Builder.getWithLocInContext(SemaRef.Context), 2668b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Loc, Loc); 2669b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 2670a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor break; 2671b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor } 2672a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 2673833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 2674833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 2675833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2676833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2677833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 2678670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 2679833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 2680828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 2681833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2682833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2683833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2684833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2685833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2686833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 2687833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 2688833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 2689833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 2690833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 2691833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 2692833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 2693833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 2694833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 26951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2696670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 2697a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = Input.getTypeSourceInfo(); 2698833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 2699a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 2700833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2701833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 2702833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 2703833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2704833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 2705833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2706670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 27071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2708670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 2709833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 2710972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 2711972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 2712972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 2713788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), Name); 27147c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl()); 2715833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 2716833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2717828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 2718828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 2719828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 2720f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::Unevaluated); 272160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E = getDerived().TransformExpr(SourceExpr); 27229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SourceExpr = (E.isInvalid() ? 0 : E.take()); 2723828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 2724828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2725828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 2726833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2727670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 27281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2729788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: { 2730b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 2731b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (QualifierLoc) { 2732b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 2733b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (!QualifierLoc) 2734b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor return true; 2735b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor } 2736b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 27371d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor CXXScopeSpec SS; 27381d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor SS.Adopt(QualifierLoc); 2739788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateName Template 27401d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 27411d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor Input.getTemplateNameLoc()); 2742788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor if (Template.isNull()) 2743788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return true; 2744c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2745b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 2746788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateNameLoc()); 2747788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return false; 2748788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor } 2749a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 2750a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 2751a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor llvm_unreachable("Caller should expand pack expansions"); 2752a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 2753670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 2754670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 27551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 2756f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::Unevaluated); 27571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2758833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 2759833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 2760833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 276160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E 2762833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 2763833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 27649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take()); 2765833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2766670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 27671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2768670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 2769670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 2770670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 27711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 2772670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 2773670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 27741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2775833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2776833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2777833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2778828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2779828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2780828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2781828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2782833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2783833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2784828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2785670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2786910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor 2787910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *TransformedArgsPtr 2788910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = new (getSema().Context) TemplateArgument[TransformedArgs.size()]; 2789910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::copy(TransformedArgs.begin(), TransformedArgs.end(), 2790910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TransformedArgsPtr); 2791910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Output = TemplateArgumentLoc(TemplateArgument(TransformedArgsPtr, 2792910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TransformedArgs.size()), 2793910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Input.getLocInfo()); 2794833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2795670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2796670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 27971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2798670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2799833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2800670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2801670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 28027ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor/// \brief Iterator adaptor that invents template argument location information 28037ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor/// for each of the template arguments in its underlying iterator. 28047ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregortemplate<typename Derived, typename InputIterator> 28057ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorclass TemplateArgumentLocInventIterator { 28067ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TreeTransform<Derived> &Self; 28077ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor InputIterator Iter; 28087ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28097ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorpublic: 28107ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLoc value_type; 28117ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLoc reference; 28127ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef typename std::iterator_traits<InputIterator>::difference_type 28137ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor difference_type; 28147ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef std::input_iterator_tag iterator_category; 28157ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28167ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor class pointer { 28177ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc Arg; 2818fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor 28197ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor public: 28207ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 28217ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28227ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor const TemplateArgumentLoc *operator->() const { return &Arg; } 28237ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor }; 28247ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28257ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocInventIterator() { } 28267ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28277ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 28287ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor InputIterator Iter) 28297ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor : Self(Self), Iter(Iter) { } 28307ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28317ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocInventIterator &operator++() { 28327ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ++Iter; 28337ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return *this; 2834fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor } 2835fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor 28367ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocInventIterator operator++(int) { 28377ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocInventIterator Old(*this); 28387ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ++(*this); 28397ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return Old; 28407ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 28417ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28427ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor reference operator*() const { 28437ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc Result; 28447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor Self.InventTemplateArgumentLoc(*Iter, Result); 28457ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return Result; 28467ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 28477ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28487ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor pointer operator->() const { return pointer(**this); } 28497ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28507ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor friend bool operator==(const TemplateArgumentLocInventIterator &X, 28517ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor const TemplateArgumentLocInventIterator &Y) { 28527ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return X.Iter == Y.Iter; 28537ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 2854fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor 28557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor friend bool operator!=(const TemplateArgumentLocInventIterator &X, 28567ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor const TemplateArgumentLocInventIterator &Y) { 28577ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return X.Iter != Y.Iter; 28587ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 28597ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor}; 28607ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 28617f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregortemplate<typename Derived> 28627ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregortemplate<typename InputIterator> 28637ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorbool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First, 28647ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor InputIterator Last, 28657f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor TemplateArgumentListInfo &Outputs) { 28667ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor for (; First != Last; ++First) { 28677f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor TemplateArgumentLoc Out; 28687ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc In = *First; 28698491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 28708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (In.getArgument().getKind() == TemplateArgument::Pack) { 28718491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // Unpack argument packs, which we translate them into separate 28728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // arguments. 28737ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor // FIXME: We could do much better if we could guarantee that the 28747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor // TemplateArgumentLocInfo for the pack expansion would be usable for 28757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor // all of the template arguments in the argument pack. 28767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLocInventIterator<Derived, 28777ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgument::pack_iterator> 28787ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor PackLocIterator; 28797ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor if (TransformTemplateArguments(PackLocIterator(*this, 28807ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor In.getArgument().pack_begin()), 28817ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor PackLocIterator(*this, 28827ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor In.getArgument().pack_end()), 28837ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor Outputs)) 28847ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return true; 28858491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 28868491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor continue; 28878491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 28888491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 28898491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (In.getArgument().isPackExpansion()) { 28908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // We have a pack expansion, for which we will be substituting into 28918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // the pattern. 28928491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor SourceLocation Ellipsis; 2893cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> OrigNumExpansions; 28948491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor TemplateArgumentLoc Pattern 2895cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor = In.getPackExpansionPattern(Ellipsis, OrigNumExpansions, 2896cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor getSema().Context); 28978491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 28988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; 28998491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 29008491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 29018491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 29028491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // Determine whether the set of unexpanded parameter packs can and should 29038491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // be expanded. 29048491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor bool Expand = true; 2905d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 2906cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 29078491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (getDerived().TryExpandParameterPacks(Ellipsis, 29088491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Pattern.getSourceRange(), 29098491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Unexpanded.data(), 29108491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Unexpanded.size(), 2911d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor Expand, 2912d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 2913d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 29148491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return true; 29158491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 29168491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (!Expand) { 29178491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // The transform has determined that we should perform a simple 29188491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // transformation on the pack expansion, producing another pack 29198491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // expansion. 29208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor TemplateArgumentLoc OutPattern; 29218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 29228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (getDerived().TransformTemplateArgument(Pattern, OutPattern)) 29238491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return true; 29248491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 2925cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 2926cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions); 29278491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (Out.getArgument().isNull()) 29288491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return true; 29298491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 29308491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Outputs.addArgument(Out); 29318491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor continue; 29328491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 29338491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 29348491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // The transform has determined that we should perform an elementwise 29358491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // expansion of the pattern. Do so. 2936cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 29378491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 29388491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 29398491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (getDerived().TransformTemplateArgument(Pattern, Out)) 29408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return true; 29418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 294277d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor if (Out.getArgument().containsUnexpandedParameterPack()) { 2943cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 2944cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor OrigNumExpansions); 294577d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor if (Out.getArgument().isNull()) 294677d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor return true; 294777d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor } 294877d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor 29498491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Outputs.addArgument(Out); 29508491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 29518491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 29523cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor // If we're supposed to retain a pack expansion, do so by temporarily 29533cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor // forgetting the partially-substituted parameter pack. 29543cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (RetainExpansion) { 29553cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 29563cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor 29573cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (getDerived().TransformTemplateArgument(Pattern, Out)) 29583cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor return true; 29593cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor 2960cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 2961cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor OrigNumExpansions); 29623cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (Out.getArgument().isNull()) 29633cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor return true; 29643cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor 29653cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor Outputs.addArgument(Out); 29663cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor } 2967d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 29688491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor continue; 29698491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 29708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 29718491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // The simple case: 29728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (getDerived().TransformTemplateArgument(In, Out)) 29737f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor return true; 29747f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 29757f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor Outputs.addArgument(Out); 29767f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor } 29777f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 29787f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor return false; 29797f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 29807f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor} 29817f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 2982577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 298743fed0de4f5bc189e45562491f83d5193eb8dac0John McCallQualType TreeTransform<Derived>::TransformType(QualType T) { 2988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 29901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2993c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 2994c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor getDerived().getBaseLocation()); 2995c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 299643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeSourceInfo *NewDI = getDerived().TransformType(DI); 29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2998a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2999a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 30001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3001a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 3002577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 30031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 300543fed0de4f5bc189e45562491f83d5193eb8dac0John McCallTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 3006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 3007a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 30081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 30101bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 3011a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 3012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 30131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType Result = getDerived().TransformType(TLB, TL); 3015a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3016a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 30171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3018a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3019577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 30201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3022a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 302343fed0de4f5bc189e45562491f83d5193eb8dac0John McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 3024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 3025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 3026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 3027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 302843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 3029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 30329f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("unhandled type loc!"); 3033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 30351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3036a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 3037a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 3038a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 3040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 30411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 30421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 3043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 304443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualifiedTypeLoc T) { 3045a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers Quals = T.getType().getLocalQualifiers(); 3046a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 304743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 3048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 30501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 3052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 3053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 3054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 3055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 30561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30572865474261a608c7873b87ba4af110d17907896dJohn McCall if (!Quals.empty()) { 30582865474261a608c7873b87ba4af110d17907896dJohn McCall Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); 30592865474261a608c7873b87ba4af110d17907896dJohn McCall TLB.push<QualifiedTypeLoc>(Result); 30602865474261a608c7873b87ba4af110d17907896dJohn McCall // No location information to preserve. 30612865474261a608c7873b87ba4af110d17907896dJohn McCall } 3062a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 3065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 306643fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate<typename Derived> 3067b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTypeLoc 3068b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 306943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType, 307043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *UnqualLookup, 3071b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor CXXScopeSpec &SS) { 3072b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor QualType T = TL.getType(); 307343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (getDerived().AlreadyTransformed(T)) 3074b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TL; 3075b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 307643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeLocBuilder TLB; 307743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType Result; 3078b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 307943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (isa<TemplateSpecializationType>(T)) { 3080b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TemplateSpecializationTypeLoc SpecTL 3081b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = cast<TemplateSpecializationTypeLoc>(TL); 3082b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 308343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateName Template = 3084b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor getDerived().TransformTemplateName(SS, 3085b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SpecTL.getTypePtr()->getTemplateName(), 3086b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SpecTL.getTemplateNameLoc(), 308743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjectType, UnqualLookup); 3088b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor if (Template.isNull()) 3089b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TypeLoc(); 3090b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 3091b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3092b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Template); 309343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } else if (isa<DependentTemplateSpecializationType>(T)) { 3094b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor DependentTemplateSpecializationTypeLoc SpecTL 3095b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = cast<DependentTemplateSpecializationTypeLoc>(TL); 3096a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 3097b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TemplateName Template 3098b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = getDerived().RebuildTemplateName(SS, 3099b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor *SpecTL.getTypePtr()->getIdentifier(), 3100b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SpecTL.getNameLoc(), 3101b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor ObjectType, UnqualLookup); 3102a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (Template.isNull()) 3103b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TypeLoc(); 3104b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 3105b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3106b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SpecTL, 3107087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor Template, 3108087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor SS); 310943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } else { 311043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // Nothing special needs to be done for these. 3111b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Result = getDerived().TransformType(TLB, TL); 311243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } 3113b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 3114b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor if (Result.isNull()) 3115b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TypeLoc(); 3116b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 3117b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc(); 311843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall} 311943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 3120c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename Derived> 3121b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTypeSourceInfo * 3122b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3123c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType ObjectType, 3124c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamedDecl *UnqualLookup, 3125c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor CXXScopeSpec &SS) { 3126c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // FIXME: Painfully copy-paste from the above! 3127c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3128b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor QualType T = TSInfo->getType(); 3129c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (getDerived().AlreadyTransformed(T)) 3130b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TSInfo; 3131c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3132c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TypeLocBuilder TLB; 3133c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType Result; 3134c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3135b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TypeLoc TL = TSInfo->getTypeLoc(); 3136c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (isa<TemplateSpecializationType>(T)) { 3137c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateSpecializationTypeLoc SpecTL 3138c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = cast<TemplateSpecializationTypeLoc>(TL); 3139c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3140b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TemplateName Template 3141b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = getDerived().TransformTemplateName(SS, 3142fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SpecTL.getTypePtr()->getTemplateName(), 3143fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SpecTL.getTemplateNameLoc(), 3144c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ObjectType, UnqualLookup); 3145c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (Template.isNull()) 3146b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return 0; 3147c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3148c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3149c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Template); 3150c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } else if (isa<DependentTemplateSpecializationType>(T)) { 3151c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor DependentTemplateSpecializationTypeLoc SpecTL 3152c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = cast<DependentTemplateSpecializationTypeLoc>(TL); 3153c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3154a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TemplateName Template 3155fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = getDerived().RebuildTemplateName(SS, 31567c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor *SpecTL.getTypePtr()->getIdentifier(), 3157fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SpecTL.getNameLoc(), 31587c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor ObjectType, UnqualLookup); 3159a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (Template.isNull()) 3160b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return 0; 3161a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 3162c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3163a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor SpecTL, 3164087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor Template, 3165087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor SS); 3166c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } else { 3167c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // Nothing special needs to be done for these. 3168c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Result = getDerived().TransformType(TLB, TL); 3169c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 3170c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3171c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (Result.isNull()) 3172b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return 0; 3173c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3174b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3175c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor} 3176c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 3178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 3179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 3180a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 3181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 3182a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 3183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 3185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 318643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall BuiltinTypeLoc T) { 3187ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 3188ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.setBuiltinLoc(T.getBuiltinLoc()); 3189ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor if (T.needsExtraLocalData()) 3190ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 3191ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return T.getType(); 3192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 319643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ComplexTypeLoc T) { 3197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 3198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 3199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 3202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 320343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall PointerTypeLoc TL) { 3204c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt QualType PointeeType 3205c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt = getDerived().TransformType(TLB, TL.getPointeeLoc()); 320692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (PointeeType.isNull()) 320792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return QualType(); 320892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 320992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor QualType Result = TL.getType(); 3210c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (PointeeType->getAs<ObjCObjectType>()) { 321192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // A dependent pointer type 'T *' has is being transformed such 321292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // that an Objective-C class type is being replaced for 'T'. The 321392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // resulting pointer type is an ObjCObjectPointerType, not a 321492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // PointerType. 3215c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 3216c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3217c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 3218c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall NewT.setStarLoc(TL.getStarLoc()); 321992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return Result; 322092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 322143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 322292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (getDerived().AlwaysRebuild() || 322392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor PointeeType != TL.getPointeeLoc().getType()) { 322492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 322592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Result.isNull()) 322692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return QualType(); 322792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 3228c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 322992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 323092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor NewT.setSigilLoc(TL.getSigilLoc()); 3231c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return Result; 3232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 32351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 3236a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 323743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall BlockPointerTypeLoc TL) { 3238db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor QualType PointeeType 3239c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3240c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt if (PointeeType.isNull()) 3241c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return QualType(); 3242c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3243c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt QualType Result = TL.getType(); 3244c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt if (getDerived().AlwaysRebuild() || 3245c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt PointeeType != TL.getPointeeLoc().getType()) { 3246c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Result = getDerived().RebuildBlockPointerType(PointeeType, 3247db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor TL.getSigilLoc()); 3248db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor if (Result.isNull()) 3249db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor return QualType(); 3250db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor } 3251db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor 325239968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 3253db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor NewT.setSigilLoc(TL.getSigilLoc()); 3254db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor return Result; 3255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 32561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 325785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 325885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 325985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 326085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 326185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 326285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 326385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 326443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ReferenceTypeLoc TL) { 326585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 326685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 326785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 326885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 326985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 327085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 327185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 327285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 327385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 327485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 327585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 327685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 327785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 327885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 327985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 328085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 328185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 328285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 328385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 328485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 328585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 328685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 328785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 328885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 328985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 329085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 329185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 329285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 3293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 3294a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 329643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall LValueReferenceTypeLoc TL) { 329743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return TransformReferenceType(TLB, TL); 3298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 32991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 3301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 330343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall RValueReferenceTypeLoc TL) { 330443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return TransformReferenceType(TLB, TL); 3305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 33061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 33081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 3309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 331043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall MemberPointerTypeLoc TL) { 3311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 3313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 33141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3315b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 3316b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara TypeSourceInfo* NewClsTInfo = 0; 3317b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara if (OldClsTInfo) { 3318b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara NewClsTInfo = getDerived().TransformType(OldClsTInfo); 3319b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara if (!NewClsTInfo) 3320b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara return QualType(); 3321b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara } 3322b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara 3323b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara const MemberPointerType *T = TL.getTypePtr(); 3324b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara QualType OldClsType = QualType(T->getClass(), 0); 3325b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara QualType NewClsType; 3326b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara if (NewClsTInfo) 3327b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara NewClsType = NewClsTInfo->getType(); 3328b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara else { 3329b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara NewClsType = getDerived().TransformType(OldClsType); 3330b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara if (NewClsType.isNull()) 3331b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara return QualType(); 3332b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara } 33331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 3337b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara NewClsType != OldClsType) { 3338b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 333985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 3340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 3345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 3346b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara NewTL.setClassTInfo(NewClsTInfo); 3347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 33511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 33521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 3353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 335443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ConstantArrayTypeLoc TL) { 3355f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const ConstantArrayType *T = TL.getTypePtr(); 3356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 33591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 3363a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 3364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 3365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 336685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 336785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 3368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3371c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 3373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 3374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 33751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 3377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 3378f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 3379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 3380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 3382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 33851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 3388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 338943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall IncompleteArrayTypeLoc TL) { 3390f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const IncompleteArrayType *T = TL.getTypePtr(); 3391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 33941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 3398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 3399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 340085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 340185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 3402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3405c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 3407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 3408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 3409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 3410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 341743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall VariableArrayTypeLoc TL) { 3418f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const VariableArrayType *T = TL.getTypePtr(); 3419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3423670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 3424f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 3425670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 342660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SizeResult 3427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 3428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 3429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 34301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Size = SizeResult.take(); 3432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 3436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 3437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 3438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 34399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Size, 3440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 344185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 3442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 3445c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 3447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 3448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 3449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 34501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 345743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentSizedArrayTypeLoc TL) { 3458f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DependentSizedArrayType *T = TL.getTypePtr(); 3459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 34621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3463670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 3464f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 34651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Prefer the expression from the TypeLoc; the other may have been uniqued. 34673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Expr *origSize = TL.getSizeExpr(); 34683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!origSize) origSize = T->getSizeExpr(); 34693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 34703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExprResult sizeResult 34713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = getDerived().TransformExpr(origSize); 34723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (sizeResult.isInvalid()) 3473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 34741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Expr *size = sizeResult.get(); 3476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 34803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall size != origSize) { 3481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 3482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 34833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall size, 3484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 348585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 3486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 34891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 3491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 3492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 3493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 3494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 34953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall NewTL.setSizeExpr(size); 3496a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 3502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 350343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentSizedExtVectorTypeLoc TL) { 3504f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DependentSizedExtVectorType *T = TL.getTypePtr(); 3505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 3507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 3508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 35101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3511670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 3512f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 3513670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 351460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 3515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 3516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3520eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 3521eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 3522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 35239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Size.take(), 3524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 3525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 3530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 3531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 3532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 3533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 3534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 3535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 3536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 3537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 354443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall VectorTypeLoc TL) { 3545f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const VectorType *T = TL.getTypePtr(); 3546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 3547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 3549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 355382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 3554e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson T->getVectorKind()); 3555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3558c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 3560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 35611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 356743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ExtVectorTypeLoc TL) { 3568f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const VectorType *T = TL.getTypePtr(); 3569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 3570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 3576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 3577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 3578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 3579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3582c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 3584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 359021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl * 35916a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas GregorTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm, 35926a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 359321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 35946a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TypeSourceInfo *NewDI = 0; 35956a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 35966a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 35976a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor // If we're substituting into a pack expansion type and we know the 35986a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TypeLoc OldTL = OldDI->getTypeLoc(); 35996a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor PackExpansionTypeLoc OldExpansionTL = cast<PackExpansionTypeLoc>(OldTL); 36006a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 36016a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TypeLocBuilder TLB; 36026a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TypeLoc NewTL = OldDI->getTypeLoc(); 36036a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TLB.reserve(NewTL.getFullDataSize()); 36046a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 36056a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor QualType Result = getDerived().TransformType(TLB, 36066a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OldExpansionTL.getPatternLoc()); 36076a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor if (Result.isNull()) 36086a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor return 0; 36096a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 36106a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor Result = RebuildPackExpansionType(Result, 36116a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OldExpansionTL.getPatternLoc().getSourceRange(), 36126a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OldExpansionTL.getEllipsisLoc(), 36136a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NumExpansions); 36146a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor if (Result.isNull()) 36156a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor return 0; 36166a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 36176a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor PackExpansionTypeLoc NewExpansionTL 36186a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor = TLB.push<PackExpansionTypeLoc>(Result); 36196a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 36206a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 36216a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor } else 36226a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NewDI = getDerived().TransformType(OldDI); 362321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewDI) 362421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return 0; 362521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 362621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (NewDI == OldDI) 362721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return OldParm; 362821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall else 362921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return ParmVarDecl::Create(SemaRef.Context, 363021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getDeclContext(), 363121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getLocation(), 363221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getIdentifier(), 363321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewDI->getType(), 363421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewDI, 363521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getStorageClass(), 363616573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor OldParm->getStorageClassAsWritten(), 363721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /* DefArg */ NULL); 363821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall} 363921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 364021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived> 364121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>:: 3642a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TransformFunctionTypeParams(SourceLocation Loc, 3643a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor ParmVarDecl **Params, unsigned NumParams, 3644a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor const QualType *ParamTypes, 3645a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor llvm::SmallVectorImpl<QualType> &OutParamTypes, 3646a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl*> *PVars) { 3647a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor for (unsigned i = 0; i != NumParams; ++i) { 3648a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (ParmVarDecl *OldParm = Params[i]) { 36496a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor llvm::Optional<unsigned> NumExpansions; 3650406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor ParmVarDecl *NewParm = 0; 3651603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (OldParm->isParameterPack()) { 3652603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We have a function parameter pack that may need to be expanded. 3653603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3654603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3655603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Find the parameter packs that could be expanded. 3656c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 3657c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(TL); 3658c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor TypeLoc Pattern = ExpansionTL.getPatternLoc(); 3659c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 3660406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 3661406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor 3662603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Determine whether we should expand the parameter packs. 3663603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor bool ShouldExpand = false; 3664d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 36656a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor llvm::Optional<unsigned> OrigNumExpansions 36666a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor = ExpansionTL.getTypePtr()->getNumExpansions(); 36676a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NumExpansions = OrigNumExpansions; 3668c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 3669c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor Pattern.getSourceRange(), 3670603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Unexpanded.data(), 3671603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Unexpanded.size(), 3672d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ShouldExpand, 3673d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 3674d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) { 3675603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor return true; 3676603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3677603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3678603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (ShouldExpand) { 3679603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Expand the function parameter pack into multiple, separate 3680603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // parameters. 368112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor getDerived().ExpandingFunctionParameterPack(OldParm); 3682cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 3683603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3684603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor ParmVarDecl *NewParm 36856a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor = getDerived().TransformFunctionTypeParam(OldParm, 36866a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OrigNumExpansions); 3687603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (!NewParm) 3688603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor return true; 3689603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3690a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor OutParamTypes.push_back(NewParm->getType()); 3691a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (PVars) 3692a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor PVars->push_back(NewParm); 3693603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3694d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 3695d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor // If we're supposed to retain a pack expansion, do so by temporarily 3696d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor // forgetting the partially-substituted parameter pack. 3697d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (RetainExpansion) { 3698d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3699d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ParmVarDecl *NewParm 37006a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor = getDerived().TransformFunctionTypeParam(OldParm, 37016a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OrigNumExpansions); 3702d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (!NewParm) 3703d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor return true; 3704d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 3705d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor OutParamTypes.push_back(NewParm->getType()); 3706d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (PVars) 3707d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor PVars->push_back(NewParm); 3708d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor } 3709d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 3710603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We're done with the pack expansion. 3711603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor continue; 3712603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3713603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3714603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We'll substitute the parameter now without expanding the pack 3715603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // expansion. 3716406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3717406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NewParm = getDerived().TransformFunctionTypeParam(OldParm, 3718406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NumExpansions); 3719406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor } else { 3720406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NewParm = getDerived().TransformFunctionTypeParam(OldParm, 3721406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor llvm::Optional<unsigned>()); 3722603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3723406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor 372421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewParm) 372521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return true; 3726603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3727a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor OutParamTypes.push_back(NewParm->getType()); 3728a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (PVars) 3729a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor PVars->push_back(NewParm); 3730603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor continue; 3731603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 3734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 3735a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor QualType OldType = ParamTypes[i]; 3736603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor bool IsPackExpansion = false; 3737cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions; 3738406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor QualType NewType; 3739603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (const PackExpansionType *Expansion 3740603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor = dyn_cast<PackExpansionType>(OldType)) { 3741603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We have a function parameter pack that may need to be expanded. 3742603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor QualType Pattern = Expansion->getPattern(); 3743603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3744603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3745603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3746603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Determine whether we should expand the parameter packs. 3747603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor bool ShouldExpand = false; 3748d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 3749a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 3750603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Unexpanded.data(), 3751603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Unexpanded.size(), 3752d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ShouldExpand, 3753d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 3754d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) { 375521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return true; 3756603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3757603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3758603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (ShouldExpand) { 3759603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Expand the function parameter pack into multiple, separate 3760603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // parameters. 3761cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 3762603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3763603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor QualType NewType = getDerived().TransformType(Pattern); 3764603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (NewType.isNull()) 3765603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor return true; 3766603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3767a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor OutParamTypes.push_back(NewType); 3768a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (PVars) 3769a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor PVars->push_back(0); 3770603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3771603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3772603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We're done with the pack expansion. 3773603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor continue; 3774603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3775603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 37763cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor // If we're supposed to retain a pack expansion, do so by temporarily 37773cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor // forgetting the partially-substituted parameter pack. 37783cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (RetainExpansion) { 37793cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 37803cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor QualType NewType = getDerived().TransformType(Pattern); 37813cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (NewType.isNull()) 37823cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor return true; 37833cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor 37843cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor OutParamTypes.push_back(NewType); 37853cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (PVars) 37863cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor PVars->push_back(0); 37873cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor } 3788d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 3789603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We'll substitute the parameter now without expanding the pack 3790603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // expansion. 3791603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor OldType = Expansion->getPattern(); 3792603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor IsPackExpansion = true; 3793406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3794406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NewType = getDerived().TransformType(OldType); 3795406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor } else { 3796406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NewType = getDerived().TransformType(OldType); 3797a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3798603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3799603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (NewType.isNull()) 3800603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor return true; 38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3802603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (IsPackExpansion) 3803cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NewType = getSema().Context.getPackExpansionType(NewType, 3804cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions); 3805603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3806a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor OutParamTypes.push_back(NewType); 3807a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (PVars) 3808a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor PVars->push_back(0); 3809577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 38101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 381121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return false; 3812603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 381321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 381421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived> 381521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType 381621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 381743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FunctionProtoTypeLoc TL) { 38187e010a04fef171049291d8cb3047f118566da090Douglas Gregor // Transform the parameters and return type. 38197e010a04fef171049291d8cb3047f118566da090Douglas Gregor // 38207e010a04fef171049291d8cb3047f118566da090Douglas Gregor // We instantiate in source order, with the return type first followed by 38217e010a04fef171049291d8cb3047f118566da090Douglas Gregor // the parameters, because users tend to expect this (even if they shouldn't 38227e010a04fef171049291d8cb3047f118566da090Douglas Gregor // rely on it!). 38237e010a04fef171049291d8cb3047f118566da090Douglas Gregor // 3824dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor // When the function has a trailing return type, we instantiate the 3825dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor // parameters before the return type, since the return type can then refer 3826dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor // to the parameters themselves (via decltype, sizeof, etc.). 3827dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor // 382821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVector<QualType, 4> ParamTypes; 382921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 3830f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const FunctionProtoType *T = TL.getTypePtr(); 38317e010a04fef171049291d8cb3047f118566da090Douglas Gregor 3832dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor QualType ResultType; 3833dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 3834dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor if (TL.getTrailingReturn()) { 3835a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 3836a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getParmArray(), 3837a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getNumArgs(), 3838a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getTypePtr()->arg_type_begin(), 3839a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor ParamTypes, &ParamDecls)) 3840dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return QualType(); 3841dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 3842dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 3843dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor if (ResultType.isNull()) 3844dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return QualType(); 3845dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor } 3846dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor else { 3847dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 3848dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor if (ResultType.isNull()) 3849dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return QualType(); 3850dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 3851a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 3852a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getParmArray(), 3853a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getNumArgs(), 3854a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getTypePtr()->arg_type_begin(), 3855a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor ParamTypes, &ParamDecls)) 3856dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return QualType(); 3857dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor } 3858dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 3859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3860a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3861a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 3862bd5f9f708aa31920d3bd73aa10fcb5de424c657aDouglas Gregor T->getNumArgs() != ParamTypes.size() || 3863a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 3864a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 3865a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 3866a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 3867a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 3868fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman T->getTypeQuals(), 3869c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor T->getRefQualifier(), 3870fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman T->getExtInfo()); 3871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 3876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 3877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 3878dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor NewTL.setTrailingReturn(TL.getTrailingReturn()); 3879a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 3880a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 3881a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3882a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 38841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 3887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 388843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FunctionNoProtoTypeLoc TL) { 3889f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const FunctionNoProtoType *T = TL.getTypePtr(); 3890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 3891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 3892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 3897a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 3898a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 3900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 3901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 3902dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor NewTL.setTrailingReturn(false); 3903a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3904a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 39061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3907ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType 3908ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 390943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall UnresolvedUsingTypeLoc TL) { 3910f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const UnresolvedUsingType *T = TL.getTypePtr(); 39117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 3912ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (!D) 3913ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 3914ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 3915ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType Result = TL.getType(); 3916ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 3917ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Result = getDerived().RebuildUnresolvedUsingType(D); 3918ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Result.isNull()) 3919ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 3920ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 3921ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 3922ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // We might get an arbitrary type spec type back. We should at 3923ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // least always get a type spec type, though. 3924ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 3925ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewTL.setNameLoc(TL.getNameLoc()); 3926ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 3927ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Result; 3928ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 3929ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 3930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 393243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypedefTypeLoc TL) { 3933f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const TypedefType *T = TL.getTypePtr(); 3934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 39357c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(), 39367c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 3937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 3938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 39391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3942a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 3943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 3944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 3949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 39501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3952577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 39531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3955a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 395643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeOfExprTypeLoc TL) { 3957670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 3958f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 396060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 3961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 3962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 3963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3965a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3966cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall E.get() != TL.getUnderlyingExpr()) { 39672a984cad5ac3fdceeff2bd99daa7b90979313475John McCall Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 3968a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3969a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 3971a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 39721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3973a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 3974cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 3975cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 3976cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 3977a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3978a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 398343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeOfTypeLoc TL) { 3984cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 3985cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 3986cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (!New_Under_TI) 3987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 39881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3990cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 3991cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 3992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3993a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3994a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 39951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3996a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 3997cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 3998cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 3999cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 4000cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setUnderlyingTInfo(New_Under_TI); 4001a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4002a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 40041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 400743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DecltypeTypeLoc TL) { 4008f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DecltypeType *T = TL.getTypePtr(); 4009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4010670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 4011f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 40121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 401360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 4014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 4015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 40161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4017a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4018a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4019a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 40202a984cad5ac3fdceeff2bd99daa7b90979313475John McCall Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 4021a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4022a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 4025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 4027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 40281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 403334b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 403434b41d939a1328f484511c6002ba2456db879a29Richard Smith AutoTypeLoc TL) { 403534b41d939a1328f484511c6002ba2456db879a29Richard Smith const AutoType *T = TL.getTypePtr(); 403634b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType OldDeduced = T->getDeducedType(); 403734b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType NewDeduced; 403834b41d939a1328f484511c6002ba2456db879a29Richard Smith if (!OldDeduced.isNull()) { 403934b41d939a1328f484511c6002ba2456db879a29Richard Smith NewDeduced = getDerived().TransformType(OldDeduced); 404034b41d939a1328f484511c6002ba2456db879a29Richard Smith if (NewDeduced.isNull()) 404134b41d939a1328f484511c6002ba2456db879a29Richard Smith return QualType(); 404234b41d939a1328f484511c6002ba2456db879a29Richard Smith } 404334b41d939a1328f484511c6002ba2456db879a29Richard Smith 404434b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType Result = TL.getType(); 404534b41d939a1328f484511c6002ba2456db879a29Richard Smith if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced) { 404634b41d939a1328f484511c6002ba2456db879a29Richard Smith Result = getDerived().RebuildAutoType(NewDeduced); 404734b41d939a1328f484511c6002ba2456db879a29Richard Smith if (Result.isNull()) 404834b41d939a1328f484511c6002ba2456db879a29Richard Smith return QualType(); 404934b41d939a1328f484511c6002ba2456db879a29Richard Smith } 405034b41d939a1328f484511c6002ba2456db879a29Richard Smith 405134b41d939a1328f484511c6002ba2456db879a29Richard Smith AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 405234b41d939a1328f484511c6002ba2456db879a29Richard Smith NewTL.setNameLoc(TL.getNameLoc()); 405334b41d939a1328f484511c6002ba2456db879a29Richard Smith 405434b41d939a1328f484511c6002ba2456db879a29Richard Smith return Result; 405534b41d939a1328f484511c6002ba2456db879a29Richard Smith} 405634b41d939a1328f484511c6002ba2456db879a29Richard Smith 405734b41d939a1328f484511c6002ba2456db879a29Richard Smithtemplate<typename Derived> 4058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 405943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall RecordTypeLoc TL) { 4060f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const RecordType *T = TL.getTypePtr(); 4061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 40627c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 40637c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 4064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 4065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 40661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 4070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 4071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 40741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 4076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 4077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 408343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall EnumTypeLoc TL) { 4084f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const EnumType *T = TL.getTypePtr(); 4085577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 40867c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 40877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 4088577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 4089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 40901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 4094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 4095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 4098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 4100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 41011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 41047da2431c23ef1ee8acb114e39692246e1801afc2John McCall 41053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived> 41063cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType( 41073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeLocBuilder &TLB, 410843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall InjectedClassNameTypeLoc TL) { 41093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 41103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.getTypePtr()->getDecl()); 41113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!D) return QualType(); 41123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 41133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 41143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 41153cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return T; 41163cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 41173cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 4118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 4120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 412143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateTypeParmTypeLoc TL) { 4122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 4123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 412649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 4127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 412843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall SubstTemplateTypeParmTypeLoc TL) { 41290b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor const SubstTemplateTypeParmType *T = TL.getTypePtr(); 41300b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor 41310b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor // Substitute into the replacement type, which itself might involve something 41320b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor // that needs to be transformed. This only tends to occur with default 41330b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor // template arguments of template template parameters. 41340b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 41350b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor QualType Replacement = getDerived().TransformType(T->getReplacementType()); 41360b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor if (Replacement.isNull()) 41370b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor return QualType(); 41380b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor 41390b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor // Always canonicalize the replacement type. 41400b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor Replacement = SemaRef.Context.getCanonicalType(Replacement); 41410b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor QualType Result 41420b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 41430b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor Replacement); 41440b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor 41450b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor // Propagate type-source information. 41460b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor SubstTemplateTypeParmTypeLoc NewTL 41470b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 41480b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor NewTL.setNameLoc(TL.getNameLoc()); 41490b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor return Result; 41500b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor 415149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 415249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 415349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 4154c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 4155c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor TypeLocBuilder &TLB, 4156c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackTypeLoc TL) { 4157c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return TransformTypeSpecType(TLB, TL); 4158c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 4159c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 4160c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregortemplate<typename Derived> 4161833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 416243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeLocBuilder &TLB, 416343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateSpecializationTypeLoc TL) { 416443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 4165828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 41661d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor // The nested-name-specifier never matters in a TemplateSpecializationType, 41671d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor // because we can't have a dependent nested-name-specifier anyway. 41681d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor CXXScopeSpec SS; 416943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateName Template 41701d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor = getDerived().TransformTemplateName(SS, T->getTemplateName(), 41711d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor TL.getTemplateNameLoc()); 417243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (Template.isNull()) 417343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return QualType(); 4174833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 417543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 4176dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 417743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 41787ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregornamespace { 41797ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// \brief Simple iterator that traverses the template arguments in a 41807ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// container that provides a \c getArgLoc() member function. 41817ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// 41827ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// This iterator is intended to be used with the iterator form of 41837ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// \c TreeTransform<Derived>::TransformTemplateArguments(). 41847ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor template<typename ArgLocContainer> 41857ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor class TemplateArgumentLocContainerIterator { 41867ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ArgLocContainer *Container; 41877ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor unsigned Index; 41887ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 41897ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor public: 41907ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLoc value_type; 41917ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLoc reference; 41927ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef int difference_type; 41937ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef std::input_iterator_tag iterator_category; 41947ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 41957ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor class pointer { 41967ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc Arg; 41977ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 41987ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor public: 41997ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 42007ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42017ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor const TemplateArgumentLoc *operator->() const { 42027ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return &Arg; 42037ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 42047ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor }; 42057ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42067ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42077ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator() {} 42087ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42097ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 42107ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor unsigned Index) 42117ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor : Container(&Container), Index(Index) { } 42127ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42137ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator &operator++() { 42147ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ++Index; 42157ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return *this; 42167ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 42177ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42187ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator operator++(int) { 42197ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator Old(*this); 42207ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ++(*this); 42217ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return Old; 42227ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 42237ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42247ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc operator*() const { 42257ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return Container->getArgLoc(Index); 42267ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 42277ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42287ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor pointer operator->() const { 42297ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return pointer(Container->getArgLoc(Index)); 42307ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 42317ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42327ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor friend bool operator==(const TemplateArgumentLocContainerIterator &X, 4233f7dd69969aa25093ca9a7897a0d8819c145d1c77Douglas Gregor const TemplateArgumentLocContainerIterator &Y) { 42347ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return X.Container == Y.Container && X.Index == Y.Index; 42357ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 42367ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42377ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 4238f7dd69969aa25093ca9a7897a0d8819c145d1c77Douglas Gregor const TemplateArgumentLocContainerIterator &Y) { 42397ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return !(X == Y); 42407ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 42417ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor }; 42427ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor} 42437ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 42447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 424543fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate <typename Derived> 4246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 4247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 4248833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 424943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateName Template) { 4250d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo NewTemplateArgs; 4251d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 4252d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 42537ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 42547ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ArgIterator; 42557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 42567ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ArgIterator(TL, TL.getNumArgs()), 42577ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor NewTemplateArgs)) 42587f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor return QualType(); 42591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4260833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 4261833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 4262833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 4263833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 4264833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 4265d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs); 42661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4267833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 4268833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 4269833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 4270833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4271833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 4272833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 4273833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4274833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4275833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4277833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 4278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4280a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregortemplate <typename Derived> 4281a88f09f34e86125ee4e6949a757aaed314012664Douglas GregorQualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 4282a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TypeLocBuilder &TLB, 4283a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DependentTemplateSpecializationTypeLoc TL, 4284087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor TemplateName Template, 4285087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor CXXScopeSpec &SS) { 4286a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TemplateArgumentListInfo NewTemplateArgs; 4287a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 4288a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 4289a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor typedef TemplateArgumentLocContainerIterator< 4290a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DependentTemplateSpecializationTypeLoc> ArgIterator; 4291a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 4292a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor ArgIterator(TL, TL.getNumArgs()), 4293a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs)) 4294a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor return QualType(); 4295a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4296a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor // FIXME: maybe don't rebuild if all the template arguments are the same. 4297a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4298a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 4299a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor QualType Result 4300a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor = getSema().Context.getDependentTemplateSpecializationType( 4301a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TL.getTypePtr()->getKeyword(), 4302a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DTN->getQualifier(), 4303a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DTN->getIdentifier(), 4304a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs); 4305a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4306a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DependentTemplateSpecializationTypeLoc NewTL 4307a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 4308a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setKeywordLoc(TL.getKeywordLoc()); 430994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 431094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 4311a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setNameLoc(TL.getNameLoc()); 4312a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setLAngleLoc(TL.getLAngleLoc()); 4313a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setRAngleLoc(TL.getRAngleLoc()); 4314a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4315a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4316a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor return Result; 4317a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor } 4318a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4319a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor QualType Result 4320a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor = getDerived().RebuildTemplateSpecializationType(Template, 4321a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TL.getNameLoc(), 4322a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs); 4323a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4324a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (!Result.isNull()) { 4325a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor /// FIXME: Wrap this in an elaborated-type-specifier? 4326a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TemplateSpecializationTypeLoc NewTL 4327a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor = TLB.push<TemplateSpecializationTypeLoc>(Result); 4328a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setTemplateNameLoc(TL.getNameLoc()); 4329a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setLAngleLoc(TL.getLAngleLoc()); 4330a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setRAngleLoc(TL.getRAngleLoc()); 4331a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4332a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4333a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor } 4334a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4335a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor return Result; 4336a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor} 4337a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 43381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4340465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 434143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ElaboratedTypeLoc TL) { 4342f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const ElaboratedType *T = TL.getTypePtr(); 4343465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 43449e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 4345465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara // NOTE: the qualifier in an ElaboratedType is optional. 43469e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor if (TL.getQualifierLoc()) { 43479e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualifierLoc 43489e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 43499e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor if (!QualifierLoc) 4350465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return QualType(); 4351465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara } 43521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 435343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 435443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (NamedT.isNull()) 435543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return QualType(); 4356a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar 4357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 43599e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualifierLoc != TL.getQualifierLoc() || 4360e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NamedT != T->getNamedType()) { 436121e413fe6305a198564d436ac515497716c47844John McCall Result = getDerived().RebuildElaboratedType(TL.getKeywordLoc(), 43629e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor T->getKeyword(), 43639e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualifierLoc, NamedT); 4364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 4367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4368465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 4369e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NewTL.setKeywordLoc(TL.getKeywordLoc()); 43709e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NewTL.setQualifierLoc(QualifierLoc); 4371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 43731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43759d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType TreeTransform<Derived>::TransformAttributedType( 43769d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall TypeLocBuilder &TLB, 43779d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedTypeLoc TL) { 43789d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall const AttributedType *oldType = TL.getTypePtr(); 43799d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 43809d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (modifiedType.isNull()) 43819d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return QualType(); 43829d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 43839d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType result = TL.getType(); 43849d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 43859d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall // FIXME: dependent operand expressions? 43869d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (getDerived().AlwaysRebuild() || 43879d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall modifiedType != oldType->getModifiedType()) { 43889d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall // TODO: this is really lame; we should really be rebuilding the 43899d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall // equivalent type from first principles. 43909d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType equivalentType 43919d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall = getDerived().TransformType(oldType->getEquivalentType()); 43929d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (equivalentType.isNull()) 43939d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return QualType(); 43949d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 43959d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall modifiedType, 43969d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall equivalentType); 43979d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall } 43989d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 43999d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 44009d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall newTL.setAttrNameLoc(TL.getAttrNameLoc()); 44019d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (TL.hasAttrOperand()) 44029d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 44039d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (TL.hasAttrExprOperand()) 44049d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall newTL.setAttrExprOperand(TL.getAttrExprOperand()); 44059d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall else if (TL.hasAttrEnumOperand()) 44069d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 44079d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 44089d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return result; 44099d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 44109d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 44119d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCalltemplate<typename Derived> 4412075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType 4413075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraTreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 4414075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenTypeLoc TL) { 4415075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 4416075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (Inner.isNull()) 4417075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(); 4418075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 4419075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType Result = TL.getType(); 4420075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (getDerived().AlwaysRebuild() || 4421075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Inner != TL.getInnerLoc().getType()) { 4422075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Result = getDerived().RebuildParenType(Inner); 4423075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (Result.isNull()) 4424075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(); 4425075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara } 4426075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 4427075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 4428075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara NewTL.setLParenLoc(TL.getLParenLoc()); 4429075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara NewTL.setRParenLoc(TL.getRParenLoc()); 4430075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return Result; 4431075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 4432075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 4433075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaratemplate<typename Derived> 44344714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, 443543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentNameTypeLoc TL) { 4436f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DependentNameType *T = TL.getTypePtr(); 4437833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 44382494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor NestedNameSpecifierLoc QualifierLoc 44392494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 44402494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor if (!QualifierLoc) 4441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 44421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 444333500955d731c73717af52088b7fc0e7a85681e7John McCall QualType Result 44442494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor = getDerived().RebuildDependentNameType(T->getKeyword(), 444533500955d731c73717af52088b7fc0e7a85681e7John McCall TL.getKeywordLoc(), 44462494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor QualifierLoc, 44472494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor T->getIdentifier(), 444833500955d731c73717af52088b7fc0e7a85681e7John McCall TL.getNameLoc()); 4449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4452e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 4453e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara QualType NamedT = ElabT->getNamedType(); 445433500955d731c73717af52088b7fc0e7a85681e7John McCall TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 445533500955d731c73717af52088b7fc0e7a85681e7John McCall 4456e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 4457e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NewTL.setKeywordLoc(TL.getKeywordLoc()); 44589e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NewTL.setQualifierLoc(QualifierLoc); 445933500955d731c73717af52088b7fc0e7a85681e7John McCall } else { 4460e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 4461e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NewTL.setKeywordLoc(TL.getKeywordLoc()); 44622494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor NewTL.setQualifierLoc(QualifierLoc); 4463e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NewTL.setNameLoc(TL.getNameLoc()); 4464e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara } 4465a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 44671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 446933500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>:: 447033500955d731c73717af52088b7fc0e7a85681e7John McCall TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 447143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentTemplateSpecializationTypeLoc TL) { 447294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 447394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (TL.getQualifierLoc()) { 447494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualifierLoc 447594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 447694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (!QualifierLoc) 4477a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor return QualType(); 4478a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor } 4479a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 448043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return getDerived() 448194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 448243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall} 448343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 448443fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate<typename Derived> 448543fed0de4f5bc189e45562491f83d5193eb8dac0John McCallQualType TreeTransform<Derived>:: 448694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorTransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 448794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor DependentTemplateSpecializationTypeLoc TL, 448894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLoc QualifierLoc) { 448994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor const DependentTemplateSpecializationType *T = TL.getTypePtr(); 449094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 449194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TemplateArgumentListInfo NewTemplateArgs; 449294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 449394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 449494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 449594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor typedef TemplateArgumentLocContainerIterator< 449694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor DependentTemplateSpecializationTypeLoc> ArgIterator; 449794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 449894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor ArgIterator(TL, TL.getNumArgs()), 449994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTemplateArgs)) 450094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return QualType(); 450194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 450294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualType Result 450394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(), 450494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualifierLoc, 450594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor T->getIdentifier(), 450694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TL.getNameLoc(), 450794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTemplateArgs); 450894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (Result.isNull()) 450994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return QualType(); 451094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 451194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 451294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualType NamedT = ElabT->getNamedType(); 451394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 451494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // Copy information relevant to the template specialization. 451594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TemplateSpecializationTypeLoc NamedTL 45160a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 451794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NamedTL.setLAngleLoc(TL.getLAngleLoc()); 451894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NamedTL.setRAngleLoc(TL.getRAngleLoc()); 4519944cdae86ecb2ab5deda96804099bd28f6a6cd39Douglas Gregor for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 45200a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 452194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 452294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // Copy information relevant to the elaborated type. 452394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 452494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTL.setKeywordLoc(TL.getKeywordLoc()); 452594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTL.setQualifierLoc(QualifierLoc); 45260a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor } else if (isa<DependentTemplateSpecializationType>(Result)) { 45270a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor DependentTemplateSpecializationTypeLoc SpecTL 45280a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 4529944cdae86ecb2ab5deda96804099bd28f6a6cd39Douglas Gregor SpecTL.setKeywordLoc(TL.getKeywordLoc()); 45300a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor SpecTL.setQualifierLoc(QualifierLoc); 45310a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor SpecTL.setLAngleLoc(TL.getLAngleLoc()); 45320a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor SpecTL.setRAngleLoc(TL.getRAngleLoc()); 45330a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor SpecTL.setNameLoc(TL.getNameLoc()); 4534944cdae86ecb2ab5deda96804099bd28f6a6cd39Douglas Gregor for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 45350a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 453694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } else { 45370a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor TemplateSpecializationTypeLoc SpecTL 45380a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor = TLB.push<TemplateSpecializationTypeLoc>(Result); 45390a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor SpecTL.setLAngleLoc(TL.getLAngleLoc()); 45400a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor SpecTL.setRAngleLoc(TL.getRAngleLoc()); 4541944cdae86ecb2ab5deda96804099bd28f6a6cd39Douglas Gregor for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 45420a0367a479e2ad204a97f87ed72f18209169b775Douglas Gregor SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 454394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } 454494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return Result; 454594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor} 454694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 454794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregortemplate<typename Derived> 45487536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorQualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 45497536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypeLoc TL) { 45502fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor QualType Pattern 45512fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor = getDerived().TransformType(TLB, TL.getPatternLoc()); 45522fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (Pattern.isNull()) 45532fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return QualType(); 45542fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 45552fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor QualType Result = TL.getType(); 45562fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (getDerived().AlwaysRebuild() || 45572fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor Pattern != TL.getPatternLoc().getType()) { 45582fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor Result = getDerived().RebuildPackExpansionType(Pattern, 45592fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor TL.getPatternLoc().getSourceRange(), 4560cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor TL.getEllipsisLoc(), 4561cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor TL.getTypePtr()->getNumExpansions()); 45622fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (Result.isNull()) 45632fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return QualType(); 45642fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor } 45652fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 45662fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 45672fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor NewT.setEllipsisLoc(TL.getEllipsisLoc()); 45682fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return Result; 45697536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 45707536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 45717536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregortemplate<typename Derived> 4572a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 457443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCInterfaceTypeLoc TL) { 4575ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // ObjCInterfaceType is never dependent. 4576c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4577c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return TL.getType(); 4578c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 4579c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 4580c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived> 4581c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType 4582c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 458343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCObjectTypeLoc TL) { 4584c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // ObjCObjectType is never dependent. 4585c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4586ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return TL.getType(); 4587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 45881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4590a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 459243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCObjectPointerTypeLoc TL) { 4593ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // ObjCObjectPointerType is never dependent. 4594c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4595ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return TL.getType(); 459624fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 459724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 4598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 459943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 460043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 460143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 460260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 46031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 46043fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 460543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 460643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 460743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 460860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 460943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 461043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 461143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 461243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 461343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 461460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 46151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 461643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 46177114cbab7eb6e8b714eb22f014327daf2c741c08John McCall bool SubStmtInvalid = false; 461843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 4619ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> Statements(getSema()); 462043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 462143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 462260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Result = getDerived().TransformStmt(*B); 46237114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (Result.isInvalid()) { 46247114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // Immediately fail if this was a DeclStmt, since it's very 46257114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // likely that this will cause problems for future statements. 46267114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (isa<DeclStmt>(*B)) 46277114cbab7eb6e8b714eb22f014327daf2c741c08John McCall return StmtError(); 46287114cbab7eb6e8b714eb22f014327daf2c741c08John McCall 46297114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // Otherwise, just keep processing substatements and fail later. 46307114cbab7eb6e8b714eb22f014327daf2c741c08John McCall SubStmtInvalid = true; 46317114cbab7eb6e8b714eb22f014327daf2c741c08John McCall continue; 46327114cbab7eb6e8b714eb22f014327daf2c741c08John McCall } 46331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 463443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 463543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 463643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 46371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46387114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (SubStmtInvalid) 46397114cbab7eb6e8b714eb22f014327daf2c741c08John McCall return StmtError(); 46407114cbab7eb6e8b714eb22f014327daf2c741c08John McCall 464143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 464243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 46433fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 464443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 464543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 464643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 464743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 464843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 464943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 46501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 465143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 465260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 46531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 465460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS, RHS; 4655264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 4656264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 4657f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 46581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4659264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 4660264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 4661264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 4662f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4664264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 4665264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 4666264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 4667f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4668264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 46691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 467043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 467143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 467243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 467360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 46749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), 467543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 46769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get(), 467743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 467843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 4679f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 468143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 468260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 468343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4684f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 468643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 46879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 468843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 468943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 469043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 469160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 46921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 469343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 469460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 469543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4696f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 469843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 469943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 47009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubStmt.get()); 470143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 47021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 470343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 470460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 47051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 470660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 470743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4708f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 47091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 471057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 471157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner S->getDecl()); 471257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 471357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return StmtError(); 471457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 471557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 471643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 4717ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner return getDerived().RebuildLabelStmt(S->getIdentLoc(), 471857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD), SourceLocation(), 471957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner SubStmt.get()); 472043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 472243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 472360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 47241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 472543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 472660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 47278cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 47288cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 4729c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 47308cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 4731aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 4732aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 4733aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 47348cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 4735f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 473699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 47378cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 4738c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 473999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 4740f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4741eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 4742eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor // Convert the condition to a boolean value. 4743afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 47448491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(), 47458491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 4746afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 4747f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4748eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 47499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE.get(); 4750afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 475199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 4752c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 47539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 47549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 4755f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4756eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 475743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 475860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Then = getDerived().TransformStmt(S->getThen()); 475943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 4760f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 47611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 476243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 476360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Else = getDerived().TransformStmt(S->getElse()); 476443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 4765f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 47661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 476743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 47689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 476999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 477043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 477143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 47723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4774eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 477544aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis Then.get(), 47769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall S->getElseLoc(), Else.get()); 477743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 477843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 477943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 478060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 47811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 478243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 478360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 4784d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor VarDecl *ConditionVar = 0; 4785d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (S->getConditionVariable()) { 4786c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 4787d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor = cast_or_null<VarDecl>( 4788aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 4789aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 4790aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 4791d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (!ConditionVar) 4792f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 479399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 4794d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 4795c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 479699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 4797f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 479899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 47991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 480043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 480160d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Switch 48029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(), 4803586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor ConditionVar); 480443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 4805f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 480743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 480860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 480943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 4810f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 481243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 48139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 48149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 481543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 48161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 481743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 481860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 48191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 482043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 482160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 48225656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor VarDecl *ConditionVar = 0; 48235656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (S->getConditionVariable()) { 4824c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 48255656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor = cast_or_null<VarDecl>( 4826aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 4827aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 4828aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 48295656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (!ConditionVar) 4830f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 483199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 48325656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 4833c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 483499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 4835f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4836afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 4837afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 4838afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor // Convert the condition to a boolean value. 48398491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(), 48408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 4841afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 4842f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE; 4844afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 484599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 48461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 48489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 4849f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4850eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 485143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 485260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 485343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 4854f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 485643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 48579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 485899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 485943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 48609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return Owned(S); 48611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4862eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, 48639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall ConditionVar, Body.get()); 486443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 48651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 486643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 486760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 486843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 486943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 487060d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 487143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 4872f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4874eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor // Transform the condition 487560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(S->getCond()); 4876eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor if (Cond.isInvalid()) 4877f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4878eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 487943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 488043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 488143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 48823fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 48831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 48859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall /*FIXME:*/S->getWhileLoc(), Cond.get(), 488643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 488743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 48881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 488943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 489060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 48911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 489243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 489360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Init = getDerived().TransformStmt(S->getInit()); 489443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 4895f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 489743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 489860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 489999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *ConditionVar = 0; 490099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (S->getConditionVariable()) { 4901c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 490299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor = cast_or_null<VarDecl>( 4903aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 4904aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 4905aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 490699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (!ConditionVar) 4907f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 490899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 490999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 4910c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 491199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 4912f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4913afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 4914afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 4915afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor // Convert the condition to a boolean value. 49168491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(), 49178491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 4918afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 4919f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4920afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 49219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE.get(); 4922afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 492399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 49241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 49269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 4927f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4928eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 492943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 493060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Inc = getDerived().TransformExpr(S->getInc()); 493143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 4932f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get())); 49359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (S->getInc() && !FullInc.get()) 4936f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4937eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 493843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 493960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 494043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 4941f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 494343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 494443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 49459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 494643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 494743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 49483fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 49491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 495043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 49519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init.get(), FullCond, ConditionVar, 49529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullInc, S->getRParenLoc(), Body.get()); 495343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 495443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 495543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 495660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 495857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 495957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner S->getLabel()); 496057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 496157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return StmtError(); 496257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 496343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 49641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 496557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD)); 496643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 496743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 496843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 496960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 497160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Target = getDerived().TransformExpr(S->getTarget()); 497243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 4973f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 497543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 497643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 49773fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 497843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 497943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 49809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Target.get()); 498143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 498243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 498343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 498460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 49863fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 498743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 49881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 498943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 499060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 49923fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 499343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 49941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 499543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 499660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 499860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(S->getRetValue()); 499943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 5000f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 500143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 50021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 500343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 50049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 500543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 50061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 500743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 500860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 50091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 501043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 501143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 501243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 501343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 5014aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), 5015aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor *D); 501643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 5017f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 50181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 501943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 502043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 50211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 502243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 502343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 50241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 502543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 50263fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 50271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 502943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 503043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 50311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 503243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 503360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 503443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 5035c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5036ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Constraints(getSema()); 5037ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Exprs(getSema()); 5038ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson llvm::SmallVector<IdentifierInfo *, 4> Names; 5039a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 504060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult AsmString; 5041ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Clobbers(getSema()); 5042703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5043703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool ExprsChanged = false; 5044c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5045703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the outputs. 5046703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 5047ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getOutputIdentifier(I)); 5048c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5049703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 50503fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Constraints.push_back(S->getOutputConstraintLiteral(I)); 5051c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5052703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the output expr. 5053703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *OutputExpr = S->getOutputExpr(I); 505460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(OutputExpr); 5055703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 5056f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5057c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5058703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != OutputExpr; 5059c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 50609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Exprs.push_back(Result.get()); 5061703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 5062c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5063703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the inputs. 5064703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 5065ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getInputIdentifier(I)); 5066c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5067703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 50683fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Constraints.push_back(S->getInputConstraintLiteral(I)); 5069c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5070703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the input expr. 5071703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *InputExpr = S->getInputExpr(I); 507260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(InputExpr); 5073703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 5074f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5075c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5076703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != InputExpr; 5077c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 50789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Exprs.push_back(Result.get()); 5079703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 5080c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5081703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (!getDerived().AlwaysRebuild() && !ExprsChanged) 50823fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5083703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5084703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the clobbers. 5085703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 50863fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Clobbers.push_back(S->getClobber(I)); 5087703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5088703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the asm string literal. 5089703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson AsmString = SemaRef.Owned(S->getAsmString()); 5090703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5091703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return getDerived().RebuildAsmStmt(S->getAsmLoc(), 5092703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isSimple(), 5093703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isVolatile(), 5094703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumOutputs(), 5095703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumInputs(), 5096a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson Names.data(), 5097703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Constraints), 5098703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Exprs), 50999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall AsmString.get(), 5100703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Clobbers), 5101703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getRParenLoc(), 5102703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isMSAsm()); 510343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 510443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 510543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 510643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 510760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 51081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 51094dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the body of the @try. 511060d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 51114dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (TryBody.isInvalid()) 5112f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5113c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 51148f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor // Transform the @catch statements (if present). 51158f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor bool AnyCatchChanged = false; 5116ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> CatchStmts(SemaRef); 51178f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 511860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 51194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Catch.isInvalid()) 5120f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 51218f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor if (Catch.get() != S->getCatchStmt(I)) 51228f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor AnyCatchChanged = true; 51238f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor CatchStmts.push_back(Catch.release()); 51244dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 5125c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 51264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the @finally statement (if present). 512760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Finally; 51284dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (S->getFinallyStmt()) { 51294dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Finally = getDerived().TransformStmt(S->getFinallyStmt()); 51304dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Finally.isInvalid()) 5131f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 51324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 51334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 51344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // If nothing changed, just retain this statement. 51354dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (!getDerived().AlwaysRebuild() && 51364dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor TryBody.get() == S->getTryBody() && 51378f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor !AnyCatchChanged && 51384dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Finally.get() == S->getFinallyStmt()) 51393fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5140c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 51414dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Build a new statement. 51429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 51439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall move_arg(CatchStmts), Finally.get()); 514443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 51451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 514643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 514760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 51481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 5149be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor // Transform the @catch parameter, if there is one. 5150be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *Var = 0; 5151be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (VarDecl *FromVar = S->getCatchParamDecl()) { 5152be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TypeSourceInfo *TSInfo = 0; 5153be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (FromVar->getTypeSourceInfo()) { 5154be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 5155be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (!TSInfo) 5156f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5157be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5158c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5159be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor QualType T; 5160be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (TSInfo) 5161be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor T = TSInfo->getType(); 5162be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor else { 5163be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor T = getDerived().TransformType(FromVar->getType()); 5164be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (T.isNull()) 5165f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5166be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5167c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5168be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 5169be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (!Var) 5170f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5171be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5172c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 517360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 5174be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (Body.isInvalid()) 5175f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5176c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5177c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 5178be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor S->getRParenLoc(), 51799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Var, Body.get()); 518043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 51811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 518243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 518360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 51841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 51854dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the body. 518660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 51874dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Body.isInvalid()) 5188f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5189c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 51904dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // If nothing changed, just retain this statement. 51914dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (!getDerived().AlwaysRebuild() && 51924dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Body.get() == S->getFinallyBody()) 51933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 51944dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 51954dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Build a new statement. 51964dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 51979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 519843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 51991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 520043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 520160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 52021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 520360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Operand; 5204d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (S->getThrowExpr()) { 5205d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor Operand = getDerived().TransformExpr(S->getThrowExpr()); 5206d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (Operand.isInvalid()) 5207f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5208d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor } 5209c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5210d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (!getDerived().AlwaysRebuild() && 5211d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor Operand.get() == S->getThrowExpr()) 52123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return getSema().Owned(S); 5213c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 52149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 521543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 52161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 521743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 521860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 521943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 52218fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Transform the object we are locking. 522260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 52238fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (Object.isInvalid()) 5224f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5225c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 52268fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Transform the body. 522760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 52288fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (Body.isInvalid()) 5229f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5230c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 52318fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // If nothing change, just retain the current statement. 52328fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (!getDerived().AlwaysRebuild() && 52338fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor Object.get() == S->getSynchExpr() && 52348fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor Body.get() == S->getSynchBody()) 52353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 52368fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor 52378fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Build a new statement. 52388fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 52399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Object.get(), Body.get()); 524043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 524143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 524243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 524360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 524443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 52451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 5246c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the element statement. 524760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Element = getDerived().TransformStmt(S->getElement()); 5248c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Element.isInvalid()) 5249f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5250c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5251c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the collection expression. 525260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 5253c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Collection.isInvalid()) 5254f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5255c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5256c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the body. 525760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 5258c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Body.isInvalid()) 5259f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5260c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5261c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // If nothing changed, just retain this statement. 5262c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (!getDerived().AlwaysRebuild() && 5263c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Element.get() == S->getElement() && 5264c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Collection.get() == S->getCollection() && 5265c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Body.get() == S->getBody()) 52663fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5267c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5268c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Build a new statement. 5269c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 5270c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /*FIXME:*/S->getForLoc(), 52719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Element.get(), 52729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Collection.get(), 5273c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor S->getRParenLoc(), 52749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 527543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 527643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 527743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 527843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 527960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 528043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 528143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 528243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 528343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 528443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 528583cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor TypeSourceInfo *T = getDerived().TransformType( 528683cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor ExceptionDecl->getTypeSourceInfo()); 528783cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor if (!T) 5288f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 52891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 529083cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T, 529143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 529283cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor ExceptionDecl->getLocation()); 5293ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor if (!Var || Var->isInvalidDecl()) 5294f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 529543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 52961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 529743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 529860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 5299ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor if (Handler.isInvalid()) 5300f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 53011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 530243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 530343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 530443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 53053fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 530643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 530743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 530843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 53099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Handler.get()); 531043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 53111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 531243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 531360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 531443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 531543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 531660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TryBlock 531743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 531843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 5319f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 53201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 532143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 532243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 5323ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> Handlers(SemaRef); 532443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 532560d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Handler 532643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 532743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 5328f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 53291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 533043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 533143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 533243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 53331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 533443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 533543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 533643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 53373fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 533843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 53399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 53401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 534143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 53421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 534343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 5344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 5345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 53461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 534760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5348454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 53493fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 53501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 53511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 535360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5354454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 535540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc; 535640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (E->getQualifierLoc()) { 535740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc 535840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 535940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (!QualifierLoc) 5360f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5361a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 5362dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 5363dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *ND 53647c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 53657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getDecl())); 5366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 5367f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 53681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5369ec8045d3f0375302eadaa63deb373bacaf25a569John McCall DeclarationNameInfo NameInfo = E->getNameInfo(); 5370ec8045d3f0375302eadaa63deb373bacaf25a569John McCall if (NameInfo.getName()) { 5371ec8045d3f0375302eadaa63deb373bacaf25a569John McCall NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 5372ec8045d3f0375302eadaa63deb373bacaf25a569John McCall if (!NameInfo.getName()) 5373f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5374ec8045d3f0375302eadaa63deb373bacaf25a569John McCall } 53752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 53762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!getDerived().AlwaysRebuild() && 537740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc == E->getQualifierLoc() && 5378a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 53792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getDecl()->getDeclName() && 5380096832c5ed5b9106fa177ebc148489760c3bc496John McCall !E->hasExplicitTemplateArgs()) { 53811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5382dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // Mark it referenced in the new context regardless. 5383dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: this is a bit instantiation-specific. 5384dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 5385a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 53863fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5387a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 5388dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 5389dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 5390096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (E->hasExplicitTemplateArgs()) { 5391dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgs = &TransArgs; 5392dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 5393dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 5394fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 5395fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 5396fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 5397fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 5398dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 5399dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 540040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 540140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor TemplateArgs); 5402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 54031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 540560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5406454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 54073fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 54091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 541160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5412454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 54133fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 541760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5418454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 54193fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 542360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5424454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 54253fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 542960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5430454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 54313fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 543560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5436454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 543760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 5438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5439f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 54401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 54423fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 54431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 5445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 5446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 544960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5450454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 545160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 5452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5453f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 54541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 54563fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 54571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 5459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 54609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get()); 5461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 546460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 54658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 54668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Transform the type. 54678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 54688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!Type) 5469f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5470c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Transform all of the components into components similar to what the 54728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // parser uses. 5473c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // FIXME: It would be slightly more efficient in the non-dependent case to 5474c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // just map FieldDecls, rather than requiring the rebuilder to look for 5475c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // the fields again. However, __builtin_offsetof is rare enough in 54768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // template code that we don't care. 54778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool ExprChanged = false; 5478f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall typedef Sema::OffsetOfComponent Component; 54798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor typedef OffsetOfExpr::OffsetOfNode Node; 54808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor llvm::SmallVector<Component, 4> Components; 54818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 54828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const Node &ON = E->getComponent(I); 54838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Component Comp; 548472be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor Comp.isBrackets = true; 54858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.LocStart = ON.getRange().getBegin(); 54868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.LocEnd = ON.getRange().getEnd(); 54878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor switch (ON.getKind()) { 54888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Array: { 54898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 549060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Index = getDerived().TransformExpr(FromIndex); 54918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (Index.isInvalid()) 5492f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5493c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor ExprChanged = ExprChanged || Index.get() != FromIndex; 54958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.isBrackets = true; 54969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Comp.U.E = Index.get(); 54978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 54988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5499c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Field: 55018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Identifier: 55028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.isBrackets = false; 55038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.U.IdentInfo = ON.getFieldName(); 550429d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor if (!Comp.U.IdentInfo) 550529d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor continue; 5506c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 5508c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5509cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor case Node::Base: 5510cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Will be recomputed during the rebuild. 5511cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor continue; 55128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5513c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Components.push_back(Comp); 55158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5516c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // If nothing changed, retain the existing expression. 55188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!getDerived().AlwaysRebuild() && 55198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Type == E->getTypeSourceInfo() && 55208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor !ExprChanged) 55213fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5522c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Build a new offsetof expression. 55248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 55258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Components.data(), Components.size(), 55268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor E->getRParenLoc()); 55277cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall} 55287cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall 55297cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCalltemplate<typename Derived> 55307cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallExprResult 55317cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallTreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 55327cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall assert(getDerived().AlreadyTransformed(E->getType()) && 55337cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall "opaque value expression requires transformation"); 55347cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall return SemaRef.Owned(E); 55358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 55368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 55378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived> 553860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5539454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 5540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 5541a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 55425557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 5543a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 55445ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 5545f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 55461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55475ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 55483fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 55491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55505ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 55511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 555560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr; 55561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 5559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 5560f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 55611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 5563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5564f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 55651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 55673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildSizeOfAlignOf(SubExpr.get(), E->getOperatorLoc(), 5571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 5572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 5573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 55741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 557660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5577454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 557860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 5579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 5580f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 55811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 558260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 5583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 5584f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 55851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 5589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 55903fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 55911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildArraySubscriptExpr(LHS.get(), 5593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 55949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get(), 5595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 5596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 55971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 559960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5600454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 5601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 560260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 5603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 5604f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 5607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 5608ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 5609aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 5610aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgChanged)) 5611aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 5612aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 5615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 56163fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 56171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 56191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 5620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 56219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 5622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 5623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 56251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 562760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5628454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 562960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 5630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 5631f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 563340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc; 563483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 563540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc 563640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 563740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor 563840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (!QualifierLoc) 5639f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 564083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 56411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5642f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member 56437c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 56447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getMemberDecl())); 5645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 5646f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56486bb8017bb9e828d118e15e59d71c66bba323c364John McCall NamedDecl *FoundDecl = E->getFoundDecl(); 56496bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (FoundDecl == E->getMemberDecl()) { 56506bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl = Member; 56516bb8017bb9e828d118e15e59d71c66bba323c364John McCall } else { 56526bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl = cast_or_null<NamedDecl>( 56536bb8017bb9e828d118e15e59d71c66bba323c364John McCall getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 56546bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!FoundDecl) 5655f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56566bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 56576bb8017bb9e828d118e15e59d71c66bba323c364John McCall 5658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 566040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc == E->getQualifierLoc() && 56618a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member == E->getMemberDecl() && 56626bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl == E->getFoundDecl() && 5663096832c5ed5b9106fa177ebc148489760c3bc496John McCall !E->hasExplicitTemplateArgs()) { 5664c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 56651f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // Mark it referenced in the new context regardless. 56661f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // FIXME: this is a bit instantiation-specific. 56671f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member); 56683fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 56691f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson } 5670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5671d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 5672096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (E->hasExplicitTemplateArgs()) { 5673d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 5674d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 5675fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 5676fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 5677fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 5678fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 56798a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 5680c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 5682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 5683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 5684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5685c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 5686c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 5687c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 5688c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 5689c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 5690c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 56919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 5692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 569340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc, 56942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara E->getMemberNameInfo(), 56958a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 56966bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl, 5697096832c5ed5b9106fa177ebc148489760c3bc496John McCall (E->hasExplicitTemplateArgs() 5698d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 5699c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope); 5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 570360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5704454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 570560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 5706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 5707f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 570960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 5710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 5711f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 5715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 57163fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 57171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 57199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), RHS.get()); 5720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 57221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 572360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 5725454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CompoundAssignOperator *E) { 5726454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformBinaryOperator(E); 5727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 573056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallExprResult TreeTransform<Derived>:: 573156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallTransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 573256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // Just rebuild the common and RHS expressions and see whether we 573356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // get any changes. 573456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 573556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 573656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (commonExpr.isInvalid()) 573756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return ExprError(); 573856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 573956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 574056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (rhs.isInvalid()) 574156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return ExprError(); 574256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 574356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (!getDerived().AlwaysRebuild() && 574456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall commonExpr.get() == e->getCommon() && 574556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs.get() == e->getFalseExpr()) 574656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return SemaRef.Owned(e); 574756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 574856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return getDerived().RebuildConditionalOperator(commonExpr.take(), 574956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall e->getQuestionLoc(), 575056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 0, 575156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall e->getColonLoc(), 575256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs.get()); 575356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 575456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 575556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCalltemplate<typename Derived> 575660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5757454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 575860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(E->getCond()); 5759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 5760f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 576260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 5763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 5764f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 576660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 5767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 5768f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 5772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 5773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 57743fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 57751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildConditionalOperator(Cond.get(), 577747e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 57789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), 577947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 57809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get()); 5781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 578460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5785454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 5786a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // Implicit casts are eliminated during transformation, since they 5787a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // will be recomputed by semantic analysis after transformation. 57886eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return getDerived().TransformExpr(E->getSubExprAsWritten()); 5789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 579260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5793454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 5794ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 5795ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 5796ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 5797ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor 579860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 57996eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 5800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5801f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5804ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 5805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 58063fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 58071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 5809ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type, 5810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 58119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get()); 5812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 581560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5816454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 581742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *OldT = E->getTypeSourceInfo(); 581842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 581942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall if (!NewT) 5820f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 582260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 5823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 5824f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 582742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall OldT == NewT && 5828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 58293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 58311d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // Note: the expression type doesn't necessarily match the 58321d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // type-as-written, but that's okay, because it should always be 58331d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // derivable from the initializer. 58341d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall 583542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 5836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 58379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init.get()); 5838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 584160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5842454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 584360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 5844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 5845f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 58493fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 58501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 58521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 5853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 58549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 5855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 5856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 5857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 586060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5861454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 5862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 58631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5864ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> Inits(SemaRef); 5865aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 5866aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Inits, &InitChanged)) 5867aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 5868aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 5869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 58703fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 58711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 5873e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 5874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 587760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5878454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 5879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 58801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 588143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 588260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init = getDerived().TransformExpr(E->getInit()); 5883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 5884f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 588643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 5887ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef); 5888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 5889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 5890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 5891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 5892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 5893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 5894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 5895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 5896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 5897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 58981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 590060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 5901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 5902f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 5905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 59061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 5908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 5909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 5910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 59111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 591360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Start 5914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 5915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 5916f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 591860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 5919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 5920f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 5923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 5924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 5925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 59261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 5928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 59291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 5931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 5932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 59331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 5936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 59373fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 59381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 5940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 59419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall E->usesGNUSyntax(), Init.get()); 5942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 594560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 5947454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ImplicitValueInitExpr *E) { 59485557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 5949c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 59505557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 59515557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 5952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 5953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5954f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 59583fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 59591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 5961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 596460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5965454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 59669bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 59679bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor if (!TInfo) 5968f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 597060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 5971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5972f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 59752cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TInfo == E->getWrittenTypeInfo() && 5976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 59773fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 59781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 59802cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TInfo, E->getRParenLoc()); 5981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 598460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5985454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 5986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5987ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> Inits(SemaRef); 5988aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 5989aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 5990aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 5991aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 5992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 5993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 5994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 5998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 5999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 6000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 6001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 6002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 600360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6004454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 600557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 600657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner E->getLabel()); 600757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 600857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return ExprError(); 600957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 6010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 601157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD)); 6012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 601560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6016454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 601760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt 6018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 6019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 6020f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 60243fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 60251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 60279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubStmt.get(), 6028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 603260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6033454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 603460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(E->getCond()); 6035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 6036f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 603860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 6040f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 604260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 6044f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 6048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 6049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 60503fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 60511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 60539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond.get(), LHS.get(), RHS.get(), 6054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 605860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6059454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 60603fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 606460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6065454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 6066668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor switch (E->getOperator()) { 6067668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_New: 6068668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Delete: 6069668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_New: 6070668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_Delete: 6071668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 6072f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6073c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6074668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Call: { 6075668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // This is a call to an object's operator(). 6076668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 6077668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6078668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the object itself. 607960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 6080668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Object.isInvalid()) 6081f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6082668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6083668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor location information 6084668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeLParenLoc 6085668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 6086668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Object.get())->getLocEnd()); 6087668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6088668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the call arguments. 6089ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6090aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 6091aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args)) 6092aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6093668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 60949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 6095668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor move_arg(Args), 6096668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor E->getLocEnd()); 6097668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 6098668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6099668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 6100668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_##Name: 6101668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 6102668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def" 6103668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Subscript: 6104668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Handled below. 6105668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor break; 6106668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6107668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Conditional: 6108668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("conditional operator is not actually overloadable"); 6109f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6110668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6111668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_None: 6112668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case NUM_OVERLOADED_OPERATORS: 6113668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("not an overloaded operator?"); 6114f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6115668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 6116668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 611760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 6118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 6119f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 612160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult First = getDerived().TransformExpr(E->getArg(0)); 6122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 6123f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 612560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Second; 6126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 6127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 6128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 6129f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 61311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 6134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 61351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 61363fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 61371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 6139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 61409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Callee.get(), 61419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall First.get(), 61429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second.get()); 6143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 61441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 614660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6147454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 6148454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCallExpr(E); 6149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 61501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 6152e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneExprResult 6153e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneTreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 6154e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform the callee. 6155e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 6156e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (Callee.isInvalid()) 6157e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6158e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6159e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform exec config. 6160e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 6161e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (EC.isInvalid()) 6162e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6163e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6164e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform arguments. 6165e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne bool ArgChanged = false; 6166e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ASTOwningVector<Expr*> Args(SemaRef); 6167e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6168e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne &ArgChanged)) 6169e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6170e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6171e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (!getDerived().AlwaysRebuild() && 6172e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne Callee.get() == E->getCallee() && 6173e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne !ArgChanged) 6174e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return SemaRef.Owned(E); 6175e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6176e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // FIXME: Wrong source location information for the '('. 6177e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne SourceLocation FakeLParenLoc 6178e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne = ((Expr *)Callee.get())->getSourceRange().getBegin(); 6179e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 6180e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne move_arg(Args), 6181e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne E->getRParenLoc(), EC.get()); 6182e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne} 6183e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6184e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournetemplate<typename Derived> 618560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6186454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 6187ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6188ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 6189ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 6190ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor 619160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 61926eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 6193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6194f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6197ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 6198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 61993fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 62021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 6203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 6204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 6205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 6206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 6207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 6208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 62091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 6210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 6211ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type, 6212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 6213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 62149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 6216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 621960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6220454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 6221454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 622560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6226454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 6227454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 623160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 6233454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXReinterpretCastExpr *E) { 6234454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 623860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6239454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 6240454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 624460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 6246454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXFunctionalCastExpr *E) { 6247ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6248ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 6249ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 62501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 625160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 62526eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 6253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6254f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6257ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 6258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 62593fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6261ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr(Type, 6262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 62639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 626860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6269454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 6270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 627157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *TInfo 627257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor = getDerived().TransformType(E->getTypeOperandSourceInfo()); 627357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor if (!TInfo) 6274f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 627757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TInfo == E->getTypeOperandSourceInfo()) 62783fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 628057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getType(), 628157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor E->getLocStart(), 628257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TInfo, 6283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 62851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 6287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 6288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 62891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 6290f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::PotentiallyPotentiallyEvaluated); 62911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 629260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 6293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6294f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 62983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 630057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getType(), 630157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor E->getLocStart(), 63029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 630760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 630801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetTreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 630901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (E->isTypeOperand()) { 631001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TypeSourceInfo *TInfo 631101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet = getDerived().TransformType(E->getTypeOperandSourceInfo()); 631201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!TInfo) 631301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return ExprError(); 631401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 631501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!getDerived().AlwaysRebuild() && 631601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TInfo == E->getTypeOperandSourceInfo()) 63173fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 631801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 63193c52a218f41f091a17582d037663594d2b8dc708Douglas Gregor return getDerived().RebuildCXXUuidofExpr(E->getType(), 632001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocStart(), 632101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TInfo, 632201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocEnd()); 632301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 632401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 632501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // We don't know whether the expression is potentially evaluated until 632601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // after we perform semantic analysis, so the expression is potentially 632701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // potentially evaluated. 632801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 632901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 633001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 633101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (SubExpr.isInvalid()) 633201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return ExprError(); 633301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 633401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!getDerived().AlwaysRebuild() && 633501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SubExpr.get() == E->getExprOperand()) 63363fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 633701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 633801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getDerived().RebuildCXXUuidofExpr(E->getType(), 633901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocStart(), 634001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SubExpr.get(), 634101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocEnd()); 634201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet} 634301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 634401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichettemplate<typename Derived> 634501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetExprResult 6346454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 63473fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 635160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 6353454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXNullPtrLiteralExpr *E) { 63543fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 635860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6359454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 6360ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor DeclContext *DC = getSema().getFunctionLevelDeclContext(); 6361ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC); 6362ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor QualType T = MD->getThisType(getSema().Context); 63631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6364ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!getDerived().AlwaysRebuild() && T == E->getType()) 63653fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 63661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6367828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 6368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 637160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6372454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 637360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 6374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6375f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 63761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 63793fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 63819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get()); 6382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 638560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6386454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 63871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 63887c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 63897c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getParam())); 6390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 6391f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 63921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 639353cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth if (!getDerived().AlwaysRebuild() && 6394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 63953fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 63961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6397036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 6398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 640160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6402ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr( 6403ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXScalarValueInitExpr *E) { 6404ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 6405ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 6406f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6407ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 6408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6409ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo()) 64103fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 64111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6412ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXScalarValueInitExpr(T, 6413ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /*FIXME:*/T->getTypeLoc().getEndLoc(), 6414ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor E->getRParenLoc()); 6415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 64161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 641860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6419454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 6420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 64211bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *AllocTypeInfo 64221bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor = getDerived().TransformType(E->getAllocatedTypeSourceInfo()); 64231bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor if (!AllocTypeInfo) 6424f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 642760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 6428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 6429f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 6432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6433ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> PlacementArgs(SemaRef); 6434aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getPlacementArgs(), 6435aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor E->getNumPlacementArgs(), true, 6436aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor PlacementArgs, &ArgumentChanged)) 6437aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 64381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 643943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 6440ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(SemaRef); 6441aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getConstructorArgs(), E->getNumConstructorArgs(), true, 6442aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor ConstructorArgs, &ArgumentChanged)) 6443aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 64441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64451af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform constructor, new operator, and delete operator. 64461af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor CXXConstructorDecl *Constructor = 0; 64471af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getConstructor()) { 64481af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor = cast_or_null<CXXConstructorDecl>( 64497c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 64507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 64511af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!Constructor) 6452f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64531af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 64541af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 64551af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorNew = 0; 64561af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorNew()) { 64571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew = cast_or_null<FunctionDecl>( 64587c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 64597c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorNew())); 64601af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorNew) 6461f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 64631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 64641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 64651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 64661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 64677c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 64687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 64691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 6470f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 6472c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 64741bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 6475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 64761af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor == E->getConstructor() && 64771af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew == E->getOperatorNew() && 64781af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete() && 64791af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor !ArgumentChanged) { 64801af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 64811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 64821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (Constructor) 64831af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 64841af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorNew) 64851af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew); 64861af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 64871af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 64883fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 64891af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 64901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64911bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor QualType AllocType = AllocTypeInfo->getType(); 64925b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArraySize.get()) { 64935b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // If no array size was specified, but the new expression was 64945b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with an array type (e.g., "new T" where T is 64955b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with "int[4]"), extract the outer bound from the 64965b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // array type as our array size. We do this with constant and 64975b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // dependently-sized array types. 64985b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 64995b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArrayT) { 65005b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // Do nothing 65015b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const ConstantArrayType *ConsArrayT 65025b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<ConstantArrayType>(ArrayT)) { 6503c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ArraySize 65049996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context, 65059996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis ConsArrayT->getSize(), 65069996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis SemaRef.Context.getSizeType(), 65079996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis /*FIXME:*/E->getLocStart())); 65085b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = ConsArrayT->getElementType(); 65095b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const DependentSizedArrayType *DepArrayT 65105b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<DependentSizedArrayType>(ArrayT)) { 65115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (DepArrayT->getSizeExpr()) { 65123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()); 65135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = DepArrayT->getElementType(); 65145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 65155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 65165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 65171bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor 6518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 6519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 6520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 6521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 6522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 65234bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor E->getTypeIdParens(), 6524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 65251bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocTypeInfo, 65269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall ArraySize.get(), 6527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 6528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 65291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 6530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 653360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6534454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 653560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 6536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 6537f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65391af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform the delete operator, if known. 65401af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 65411af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 65421af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 65437c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 65447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 65451af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 6546f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65471af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 6548c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 65501af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Operand.get() == E->getArgument() && 65511af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete()) { 65521af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 65531af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 65541af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 65551af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 65565833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor 65575833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor if (!E->getArgument()->isTypeDependent()) { 65585833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor QualType Destroyed = SemaRef.Context.getBaseElementType( 65595833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor E->getDestroyedType()); 65605833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 65615833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 65625833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), 65635833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor SemaRef.LookupDestructor(Record)); 65645833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor } 65655833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor } 65665833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor 65673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 65681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 65691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 6571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 6572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 65739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Operand.get()); 6574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 657760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6578a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 6579454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXPseudoDestructorExpr *E) { 658060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 6581a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 6582f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6584b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ObjectTypePtr; 6585a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor bool MayBePseudoDestructor = false; 65869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 6587a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getOperatorLoc(), 6588a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->isArrow()? tok::arrow : tok::period, 6589a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectTypePtr, 6590a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor MayBePseudoDestructor); 6591a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (Base.isInvalid()) 6592f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6593c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6594b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall QualType ObjectType = ObjectTypePtr.get(); 6595f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 6596f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor if (QualifierLoc) { 6597f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor QualifierLoc 6598f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 6599f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor if (!QualifierLoc) 660043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return ExprError(); 660143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } 6602f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor CXXScopeSpec SS; 6603f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SS.Adopt(QualifierLoc); 66041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6605a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed; 6606a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (E->getDestroyedTypeInfo()) { 6607a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedTypeInfo 660843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 6609b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor ObjectType, 0, SS); 6610a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!DestroyedTypeInfo) 6611f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6612a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = DestroyedTypeInfo; 6613a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else if (ObjectType->isDependentType()) { 6614a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // We aren't likely to be able to resolve the identifier down to a type 6615a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // now anyway, so just retain the identifier. 6616a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 6617a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 6618a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else { 6619a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // Look for a destructor known with the given name. 6620b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 6621a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor *E->getDestroyedTypeIdentifier(), 6622a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc(), 6623a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /*Scope=*/0, 6624a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS, ObjectTypePtr, 6625a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor false); 6626a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!T) 6627f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6628c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6629a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed 6630a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 6631a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 6632a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 663326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 663426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeTypeInfo = 0; 663526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (E->getScopeTypeInfo()) { 663643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo()); 663726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (!ScopeTypeInfo) 6638f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6639a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 6640c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 66419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 6642a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 6643a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 6644f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SS, 664526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor ScopeTypeInfo, 664626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor E->getColonColonLoc(), 6647fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor E->getTildeLoc(), 6648a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed); 6649a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 66501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6651a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 665260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6653ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 6654454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall UnresolvedLookupExpr *Old) { 6655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 6656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Sema::LookupOrdinaryName); 6657f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Transform all the decls. 6659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 6660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = Old->decls_end(); I != E; ++I) { 66617c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 66627c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getNameLoc(), 66637c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 66649f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 66659f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 66669f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 66679f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 66689f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 66699f54ad4381370c6b771424b53d219e661d6d6706John McCall else 6670f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 66719f54ad4381370c6b771424b53d219e661d6d6706John McCall } 6672f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6673f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Expand using declarations. 6674f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (isa<UsingDecl>(InstD)) { 6675f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 6676f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 6677f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = UD->shadow_end(); I != E; ++I) 6678f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(*I); 6679f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall continue; 6680f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6681f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6682f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(InstD); 6683f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6684f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6685f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Resolve a kind, but don't do any further analysis. If it's 6686f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // ambiguous, the callee needs to deal with it. 6687f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.resolveKind(); 6688f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6689f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Rebuild the nested-name qualifier, if present. 6690f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 66914c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (Old->getQualifierLoc()) { 66924c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc 66934c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 66944c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (!QualifierLoc) 6695f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6696c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 66974c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor SS.Adopt(QualifierLoc); 6698c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt } 6699c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6700c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor if (Old->getNamingClass()) { 670166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor CXXRecordDecl *NamingClass 670266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 670366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNameLoc(), 670466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNamingClass())); 670566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor if (!NamingClass) 6706f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6707c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 670866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor R.setNamingClass(NamingClass); 6709f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6710f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6711f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have no template arguments, it's a normal declaration name. 6712f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Old->hasExplicitTemplateArgs()) 6713f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 6714f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6715f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have template arguments, rebuild them, then rebuild the 6716f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // templateid expression. 6717f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 6718fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 6719fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor Old->getNumTemplateArgs(), 6720fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 6721fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 6722f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6723f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(), 6724f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs); 6725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 67261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 672860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6729454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 67303d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 67313d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor if (!T) 6732f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 67353d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor T == E->getQueriedTypeSourceInfo()) 67363fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 67371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 6739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 6740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 6741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 67431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 674560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 67466ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetTreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 67476ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo()); 67486ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!LhsT) 67496ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return ExprError(); 67506ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 67516ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo()); 67526ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!RhsT) 67536ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return ExprError(); 67546ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 67556ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!getDerived().AlwaysRebuild() && 67566ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo()) 67576ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return SemaRef.Owned(E); 67586ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 67596ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return getDerived().RebuildBinaryTypeTrait(E->getTrait(), 67606ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet E->getLocStart(), 67616ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet LhsT, RhsT, 67626ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet E->getLocEnd()); 67636ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet} 67646ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 67656ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichettemplate<typename Derived> 67666ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetExprResult 6767865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 67682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DependentScopeDeclRefExpr *E) { 676900cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc 677000cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 677100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor if (!QualifierLoc) 6772f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 677443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // TODO: If this is a conversion-function-id, verify that the 677543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // destination type name (if present) resolves the same way after 677643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // instantiation as it did in the local scope. 677743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 67782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo 67792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 67802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!NameInfo.getName()) 6781f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6783f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!E->hasExplicitTemplateArgs()) { 6784f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!getDerived().AlwaysRebuild() && 678500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor QualifierLoc == E->getQualifierLoc() && 67862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // Note: it is sufficient to compare the Name component of NameInfo: 67872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // if name has not changed, DNLoc has not changed either. 67882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getDeclName()) 67893fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 67901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 679100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 67922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 6793f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /*TemplateArgs*/ 0); 6794f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 6795d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 6796d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 6797fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 6798fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 6799fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 6800fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 6801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 680200cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 68032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 6804f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall &TransArgs); 6805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 680860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6809454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 6810321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // CXXConstructExprs are always implicit, so when we have a 6811321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // 1-argument construction we just transform that argument. 6812321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor if (E->getNumArgs() == 1 || 6813321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) 6814321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor return getDerived().TransformExpr(E->getArg(0)); 6815321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor 6816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 6817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 6819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 6820f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 6823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 68247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 68257c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 6826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 6827f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6830ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6831aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6832aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 6833aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6834aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 6835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 6837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 6838c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor !ArgumentChanged) { 68391af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark the constructor as referenced. 68401af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: Instantiation-specific 6841c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 68423fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6843c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor } 68441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68454411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 68464411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor Constructor, E->isElidable(), 68478c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor move_arg(Args), 68488c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor E->requiresZeroInitialization(), 6849428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth E->getConstructionKind(), 6850428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth E->getParenRange()); 6851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 6854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 68555132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 68565132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that. 6857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 685860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6859454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 68605132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 6861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68634765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// \brief Transform a C++ expression that contains cleanups that should 68644765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// be run after the expression is evaluated. 6865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 68664765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// Since ExprWithCleanups nodes are implicitly generated, we 68675132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that. 6868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 686960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 68704765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallTreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 68715132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 6872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 687560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 6877ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXTemporaryObjectExpr *E) { 6878ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 6879ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 6880f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 6883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 6884c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt getDerived().TransformDecl(E->getLocStart(), 68857c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 6886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 6887f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6890ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 6892aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6893aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 6894aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 68951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6897ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo() && 6898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 689991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor !ArgumentChanged) { 690091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // FIXME: Instantiation-specific 6901ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 69023fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.MaybeBindToTemporary(E); 690391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor } 6904ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 6905ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(T, 6906ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /*FIXME:*/T->getTypeLoc().getEndLoc(), 6907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 6908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 69101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 691260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 6914454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXUnresolvedConstructExpr *E) { 6915ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 6916ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 6917f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 69181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6920ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6921aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args.reserve(E->arg_size()); 6922aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 6923aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 6924aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6925aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 6926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6927ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo() && 6928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 69293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 69301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 6932ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(T, 6933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 6934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 6935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 69371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 693960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6940865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 69412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara CXXDependentScopeMemberExpr *E) { 6942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 694360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base((Expr*) 0); 6944aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *OldBase; 6945aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 6946aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType ObjectType; 6947aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->isImplicitAccess()) { 6948aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = E->getBase(); 6949aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(OldBase); 6950aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 6951f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 69521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6953aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall // Start the member reference and compute the object's type. 6954b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ObjectTy; 6955d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor bool MayBePseudoDestructor = false; 69569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 6957aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall E->getOperatorLoc(), 6958a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 6959d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor ObjectTy, 6960d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor MayBePseudoDestructor); 6961aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 6962f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6963aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 6964b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ObjectType = ObjectTy.get(); 6965aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 6966aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 6967aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = 0; 6968aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(E->getBaseType()); 6969aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 6970aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 69711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69726cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 69736cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 6974c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 69756cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 69767c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor E->getFirstQualifierFoundInScope(), 69777c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor E->getQualifierLoc().getBeginLoc()); 69781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69797c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 6980a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 69817c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc 69827c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 69837c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor ObjectType, 69847c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor FirstQualifierInScope); 69857c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor if (!QualifierLoc) 6986f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6987a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 69881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 698943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // TODO: If this is a conversion-function-id, verify that the 699043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // destination type name (if present) resolves the same way after 699143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // instantiation as it did in the local scope. 699243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 69932577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo 699443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 69952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!NameInfo.getName()) 6996f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 69971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6998aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->hasExplicitTemplateArgs()) { 69993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 70003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 70013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 7002aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base.get() == OldBase && 7003aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType == E->getBaseType() && 70047c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc == E->getQualifierLoc() && 70052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getMember() && 70063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 70073fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 70081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 7010aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 70113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 70123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 70137c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc, 7014129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall FirstQualifierInScope, 70152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 7016129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /*TemplateArgs*/ 0); 70173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 70183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 7019d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 7020fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 7021fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 7022fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 7023fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 70241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 7026aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 7027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 7028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 70297c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc, 70303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 70312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 7032129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall &TransArgs); 7033129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 7034129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7035129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived> 703660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7037454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 7038129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform the base of the expression. 703960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base((Expr*) 0); 7040aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 7041aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Old->isImplicitAccess()) { 7042aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(Old->getBase()); 7043aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 7044f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7045aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 7046aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 7047aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(Old->getBaseType()); 7048aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 7049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 70504c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 70514c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (Old->getQualifierLoc()) { 70524c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor QualifierLoc 70534c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 70544c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (!QualifierLoc) 7055f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7056129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7057129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 70582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara LookupResult R(SemaRef, Old->getMemberNameInfo(), 7059129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Sema::LookupOrdinaryName); 7060129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7061129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform all the decls. 7062129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 7063129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = Old->decls_end(); I != E; ++I) { 70647c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 70657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getMemberLoc(), 70667c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 70679f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 70689f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 70699f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 70709f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 70719f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 70729f54ad4381370c6b771424b53d219e661d6d6706John McCall else 7073f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 70749f54ad4381370c6b771424b53d219e661d6d6706John McCall } 7075129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7076129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Expand using declarations. 7077129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (isa<UsingDecl>(InstD)) { 7078129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 7079129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 7080129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = UD->shadow_end(); I != E; ++I) 7081129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(*I); 7082129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall continue; 7083129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7084129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7085129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(InstD); 7086129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7087129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7088129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.resolveKind(); 7089129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7090c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor // Determine the naming class. 7091042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth if (Old->getNamingClass()) { 7092c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt CXXRecordDecl *NamingClass 7093c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 709466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getMemberLoc(), 709566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNamingClass())); 709666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor if (!NamingClass) 7097f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7098c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 709966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor R.setNamingClass(NamingClass); 7100c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor } 7101c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7102129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentListInfo TransArgs; 7103129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->hasExplicitTemplateArgs()) { 7104129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setLAngleLoc(Old->getLAngleLoc()); 7105129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setRAngleLoc(Old->getRAngleLoc()); 7106fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 7107fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor Old->getNumTemplateArgs(), 7108fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 7109fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 7110129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7111c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 7112c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 7113c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 7114c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 7115c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 7116c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 7117c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 71189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 7119aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 7120129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getOperatorLoc(), 7121129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->isArrow(), 71224c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor QualifierLoc, 7123c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope, 7124129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R, 7125129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall (Old->hasExplicitTemplateArgs() 7126129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall ? &TransArgs : 0)); 7127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 713060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 71312e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlTreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 71322e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 71332e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl if (SubExpr.isInvalid()) 71342e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return ExprError(); 71352e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 71362e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 71373fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 71382e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 71392e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 71402e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl} 71412e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 71422e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redltemplate<typename Derived> 71432e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlExprResult 7144be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorTreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 71454f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 71464f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor if (Pattern.isInvalid()) 71474f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor return ExprError(); 71484f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 71494f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 71504f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor return SemaRef.Owned(E); 71514f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 715267fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 715367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor E->getNumExpansions()); 7154be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor} 7155ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7156ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregortemplate<typename Derived> 7157ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorExprResult 7158ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorTreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 7159ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // If E is not value-dependent, then nothing will change when we transform it. 7160ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // Note: This is an instantiation-centric view. 7161ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor if (!E->isValueDependent()) 7162ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return SemaRef.Owned(E); 7163ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7164ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // Note: None of the implementations of TryExpandParameterPacks can ever 7165ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // produce a diagnostic when given only a single unexpanded parameter pack, 7166ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // so 7167ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 7168ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor bool ShouldExpand = false; 7169d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 7170cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions; 7171ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 7172ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor &Unexpanded, 1, 7173d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ShouldExpand, RetainExpansion, 7174d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 7175ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return ExprError(); 7176ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7177d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (!ShouldExpand || RetainExpansion) 7178ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return SemaRef.Owned(E); 7179be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 7180ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // We now know the length of the parameter pack, so build a new expression 7181ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // that stores that length. 7182ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 7183ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor E->getPackLoc(), E->getRParenLoc(), 7184cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor *NumExpansions); 7185ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor} 7186ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7187be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregortemplate<typename Derived> 7188be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorExprResult 7189c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorTreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 7190c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SubstNonTypeTemplateParmPackExpr *E) { 7191c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor // Default behavior is to do nothing with this transformation. 7192c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor return SemaRef.Owned(E); 7193c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor} 7194c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 7195c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregortemplate<typename Derived> 7196c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorExprResult 7197454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 71983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 72011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 720260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7203454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 720481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodedTypeInfo 720581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 720681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor if (!EncodedTypeInfo) 7207f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 72081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 721081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 72113fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 721481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor EncodedTypeInfo, 7215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 7216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 72171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 721960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7220454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 722192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Transform arguments. 722292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor bool ArgChanged = false; 7223ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 7224aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args.reserve(E->getNumArgs()); 7225aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 7226aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgChanged)) 7227aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 7228aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 722992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (E->getReceiverKind() == ObjCMessageExpr::Class) { 723092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Class message: transform the receiver type. 723192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor TypeSourceInfo *ReceiverTypeInfo 723292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformType(E->getClassReceiverTypeInfo()); 723392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!ReceiverTypeInfo) 7234f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7235c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 723692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If nothing changed, just retain the existing message send. 723792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!getDerived().AlwaysRebuild() && 723892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 72393fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 724092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 724192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Build a new class message send. 724292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 724392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getSelector(), 7244f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis E->getSelectorLoc(), 724592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getMethodDecl(), 724692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getLeftLoc(), 724792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move_arg(Args), 724892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getRightLoc()); 724992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 725092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 725192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Instance message: transform the receiver 725292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 725392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor "Only class and instance messages may be instantiated"); 725460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Receiver 725592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformExpr(E->getInstanceReceiver()); 725692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Receiver.isInvalid()) 7257f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 725892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 725992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If nothing changed, just retain the existing message send. 726092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!getDerived().AlwaysRebuild() && 726192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 72623fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7263c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 726492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Build a new instance message send. 72659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCMessageExpr(Receiver.get(), 726692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getSelector(), 7267f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis E->getSelectorLoc(), 726892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getMethodDecl(), 726992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getLeftLoc(), 727092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move_arg(Args), 727192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getRightLoc()); 7272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 72741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 727560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7276454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 72773fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 72801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 728160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7282454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 72833fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 72861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 728760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7288454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 7289f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // Transform the base expression. 729060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7291f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Base.isInvalid()) 7292f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7293f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 7294f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // We don't need to transform the ivar; it will never change. 7295c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7296f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // If nothing changed, just retain the existing expression. 7297f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (!getDerived().AlwaysRebuild() && 7298f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base.get() == E->getBase()) 72993fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7300c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 73019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 7302f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->getLocation(), 7303f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->isArrow(), E->isFreeIvar()); 7304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 73061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 730760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7308454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 730912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // 'super' and types never change. Property never changes. Just 731012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // retain the existing expression. 731112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (!E->isObjectReceiver()) 73123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 73138ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian 7314e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // Transform the base expression. 731560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7316e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Base.isInvalid()) 7317f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7318c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7319e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // We don't need to transform the property; it will never change. 7320c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7321e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // If nothing changed, just retain the existing expression. 7322e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (!getDerived().AlwaysRebuild() && 7323e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Base.get() == E->getBase()) 73243fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 732612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (E->isExplicitProperty()) 732712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 732812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getExplicitProperty(), 732912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getLocation()); 733012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall 733112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 733212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getType(), 733312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getImplicitPropertyGetter(), 733412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getImplicitPropertySetter(), 733512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getLocation()); 7336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 73381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 733960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7340454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 7341f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // Transform the base expression. 734260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7343f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Base.isInvalid()) 7344f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7345c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7346f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // If nothing changed, just retain the existing expression. 7347f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (!getDerived().AlwaysRebuild() && 7348f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base.get() == E->getBase()) 73493fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7350c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 73519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 7352f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->isArrow()); 7353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 73551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 735660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7357454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 7358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 7359ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> SubExprs(SemaRef); 7360aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor SubExprs.reserve(E->getNumSubExprs()); 7361aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 7362aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor SubExprs, &ArgumentChanged)) 7363aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 73641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 7366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 73673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 73681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 7370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 7371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 7372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 73741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 737560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7376454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 7377c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall BlockDecl *oldBlock = E->getBlockDecl(); 7378a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 7379c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0); 7380c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 7381c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7382c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 7383c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall llvm::SmallVector<ParmVarDecl*, 4> params; 7384c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall llvm::SmallVector<QualType, 4> paramTypes; 7385a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 7386a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // Parameter substitution. 7387c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(), 7388c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->param_begin(), 7389c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->param_size(), 7390c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 0, paramTypes, ¶ms)) 7391a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor return true; 7392c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7393c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall const FunctionType *exprFunctionType = E->getFunctionType(); 7394c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall QualType exprResultType = exprFunctionType->getResultType(); 7395c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!exprResultType.isNull()) { 7396c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!exprResultType->isDependentType()) 7397c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = exprResultType; 7398c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall else if (exprResultType != getSema().Context.DependentTy) 7399c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = getDerived().TransformType(exprResultType); 7400a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian } 7401a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7402a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // If the return type has not been determined yet, leave it as a dependent 7403a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // type; it'll get set when we process the body. 7404c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType.isNull()) 7405c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = getSema().Context.DependentTy; 7406a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7407a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // Don't allow returning a objc interface by value. 7408c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType->isObjCObjectType()) { 7409c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall getSema().Diag(E->getCaretLocation(), 7410a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor diag::err_object_cannot_be_passed_returned_by_value) 7411c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall << 0 << blockScope->ReturnType; 7412a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor return ExprError(); 7413a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor } 7414711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7415c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall QualType functionType = getDerived().RebuildFunctionProtoType( 7416c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType, 7417c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall paramTypes.data(), 7418c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall paramTypes.size(), 7419c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->isVariadic(), 7420c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor 0, RQ_None, 7421c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall exprFunctionType->getExtInfo()); 7422c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->FunctionType = functionType; 7423711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7424711c52bb20d0c69063b52a99826fb7d2835501f1John McCall // Set the parameters on the block decl. 7425c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!params.empty()) 7426c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->TheDecl->setParams(params.data(), params.size()); 7427a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7428a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // If the return type wasn't explicitly set, it will have been marked as a 7429a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // dependent type (DependentTy); clear out the return type setting so 7430a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // we will deduce the return type when type-checking the block's body. 7431c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType == getSema().Context.DependentTy) 7432c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = QualType(); 7433a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7434711c52bb20d0c69063b52a99826fb7d2835501f1John McCall // Transform the body 7435c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall StmtResult body = getDerived().TransformStmt(E->getBody()); 7436c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (body.isInvalid()) 7437711c52bb20d0c69063b52a99826fb7d2835501f1John McCall return ExprError(); 7438711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7439c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#ifndef NDEBUG 7440c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // In builds with assertions, make sure that we captured everything we 7441c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // captured before. 7442c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7443c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (oldBlock->capturesCXXThis()) assert(blockScope->CapturesCXXThis); 7444c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7445c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall for (BlockDecl::capture_iterator i = oldBlock->capture_begin(), 7446c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall e = oldBlock->capture_end(); i != e; ++i) { 74476b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall VarDecl *oldCapture = i->getVariable(); 7448c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7449c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // Ignore parameter packs. 7450c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (isa<ParmVarDecl>(oldCapture) && 7451c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall cast<ParmVarDecl>(oldCapture)->isParameterPack()) 7452c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall continue; 7453c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7454c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall VarDecl *newCapture = 7455c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 7456c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldCapture)); 74576b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall assert(blockScope->CaptureMap.count(newCapture)); 7458c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall } 7459c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#endif 7460c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7461c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 7462c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall /*Scope=*/0); 7463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 74651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 746660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7467454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 7468a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian ValueDecl *ND 7469a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 7470a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian E->getDecl())); 7471a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian if (!ND) 7472f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 74732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 7474a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian if (!getDerived().AlwaysRebuild() && 7475a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian ND == E->getDecl()) { 7476a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // Mark it referenced in the new context regardless. 7477a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // FIXME: this is a bit instantiation-specific. 7478a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 7479a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 74803fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7481a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian } 7482a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 74832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation()); 748440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return getDerived().RebuildDeclRefExpr(NestedNameSpecifierLoc(), 74852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ND, NameInfo, 0); 7486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 74871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 7489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 7490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 7491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 74921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 749385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 749485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 74952865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildPointerType(PointeeType, Star, 7496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 7497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 74991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 750085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 750185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 75022865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Star, 7503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 7504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 75061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 75071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 750885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 750985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 751085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 75112865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 751285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 7513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 75151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 75161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 751785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 751885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 751985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 75202865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 752185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 7522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 7526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 7527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 7528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 7529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 7530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 7532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 7533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 7534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 7535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 75361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 75381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 75391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 75401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 7541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 7542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 7543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 7544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 7545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 7546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 7547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 7548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 75491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75509996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis IntegerLiteral ArraySize(SemaRef.Context, *Size, SizeType, 75519996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis /*FIXME*/BracketsRange.getBegin()); 75521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 7553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 75541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 7555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 75561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 75591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 7560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 7561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 756285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 756385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 75641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 756585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 7566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 75701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 7571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 757285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 757385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 75741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 757585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 7576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 75771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 75801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 7581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 75829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 75851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 75869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SizeExpr, 7587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 7588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 75921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 7593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 75949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 75971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 75989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SizeExpr, 7599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 7600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 7604e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson unsigned NumElements, 7605e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::VectorKind VecKind) { 7606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 7607e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 7608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 7612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 7613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 7614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 7615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 7616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 76179996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 76189996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis AttributeLoc); 76199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 7620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 76231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 76241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 76259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 76279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 7628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 76321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 7633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 76341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 7635fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman unsigned Quals, 7636c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor RefQualifierKind RefQualifier, 7637fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman const FunctionType::ExtInfo &Info) { 76381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 7639c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor Quals, RefQualifier, 7640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 7641fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman getDerived().getBaseEntity(), 7642fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman Info); 7643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 7647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 7648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 7649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 7650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 7651ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 7652ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(D && "no decl found"); 7653ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (D->isInvalidDecl()) return QualType(); 7654ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 765592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // FIXME: Doesn't account for ObjCInterfaceDecl! 7656ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeDecl *Ty; 7657ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (isa<UsingDecl>(D)) { 7658ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Using = cast<UsingDecl>(D); 7659ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(Using->isTypeName() && 7660ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-typename using"); 7661ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7662ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // A valid resolved using typename decl points to exactly one type decl. 7663ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(++Using->shadow_begin() == Using->shadow_end()); 7664ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 7665c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7666ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } else { 7667ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(isa<UnresolvedUsingTypenameDecl>(D) && 7668ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-using decl"); 7669ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<UnresolvedUsingTypenameDecl>(D); 7670ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 7671ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7672ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return SemaRef.Context.getTypeDeclType(Ty); 7673ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 7674ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7675ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> 76762a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 76772a984cad5ac3fdceeff2bd99daa7b90979313475John McCall SourceLocation Loc) { 76782a984cad5ac3fdceeff2bd99daa7b90979313475John McCall return SemaRef.BuildTypeofExprType(E, Loc); 7679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 7683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 7684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 76872a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 76882a984cad5ac3fdceeff2bd99daa7b90979313475John McCall SourceLocation Loc) { 76892a984cad5ac3fdceeff2bd99daa7b90979313475John McCall return SemaRef.BuildDecltypeType(E, Loc); 7690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7691577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7692577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7693577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 7694833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 7695833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 769667714230a191bc3c01f33378f34f34ef377991a6Douglas Gregor TemplateArgumentListInfo &TemplateArgs) { 7697d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 7698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7700dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 77011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 7702fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 7703d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 7704d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 7705fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 7706d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 7707d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 7708d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 7709d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 77101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 7711fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 7712fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor const IdentifierInfo &Name, 7713fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 771443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType, 771543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *FirstQualifierInScope) { 7716fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor UnqualifiedId TemplateName; 7717fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName.setIdentifier(&Name, NameLoc); 7718d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Sema::TemplateTy Template; 7719d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor getSema().ActOnDependentTemplateName(/*Scope=*/0, 7720fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /*FIXME:*/SourceLocation(), 7721d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor SS, 7722fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName, 7723b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType::make(ObjectType), 7724d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor /*EnteringContext=*/false, 7725d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Template); 772643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return Template.get(); 7727d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 77281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 7730ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 7731fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 7732ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 7733fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 7734ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 7735ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 7736fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // FIXME: Bogus location information. 7737fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 7738fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 7739d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Sema::TemplateTy Template; 7740d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor getSema().ActOnDependentTemplateName(/*Scope=*/0, 7741fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /*FIXME:*/SourceLocation(), 7742d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor SS, 7743d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Name, 7744b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType::make(ObjectType), 7745d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor /*EnteringContext=*/false, 7746d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Template); 7747d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor return Template.template getAsVal<TemplateName>(); 7748ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 7749c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7750ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 775160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 7753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 77549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *OrigCallee, 77559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *First, 77569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Second) { 77579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Callee = OrigCallee->IgnoreParenCasts(); 77589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 77591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 7761f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 77629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType() && 77639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall !Second->getType()->isOverloadableType()) 77649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().CreateBuiltinArraySubscriptExpr(First, 77659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Callee->getLocStart(), 77669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second, OpLoc); 77671a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 77681a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 77699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc); 77709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall } else if (Second == 0 || isPostIncDec) { 77719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType()) { 7772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 7773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 77742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall UnaryOperatorKind Opc 7775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 77761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 7778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 7779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 77809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType() && 77819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall !Second->getType()->isOverloadableType()) { 7782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 7783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 77842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 778560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 77869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 7787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 7788f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 77891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 7791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 7792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 77931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 7795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 77966e26689f5d513e24ad7783a4493201930fdeccc0John McCall UnresolvedSet<16> Functions; 77971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 7799ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 7800ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 7801ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 7802ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 78036e26689f5d513e24ad7783a4493201930fdeccc0John McCall Functions.append(ULE->decls_begin(), ULE->decls_end()); 7804ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 78059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl()); 7806ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 78071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 78099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Args[2] = { First, Second }; 78109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall unsigned NumArgs = 1 + (Second != 0); 78111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 7813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 78142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall UnaryOperatorKind Opc 7815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 78169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 7817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 78181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7819f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 78209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(), 7821ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 78229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall First, 78239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second); 7824f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 7825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 78262de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 782760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 7828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 7829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 7830f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 78311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 7833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 78341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 783526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived> 783660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 78379ae2f076ca5ab1feb3ba95629099ec2319833701John McCallTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 783826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation OperatorLoc, 783926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor bool isArrow, 7840f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor CXXScopeSpec &SS, 784126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeType, 784226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation CCLoc, 7843fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 7844a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed) { 78459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall QualType BaseType = Base->getType(); 78469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (Base->isTypeDependent() || Destroyed.getIdentifier() || 784726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor (!isArrow && !BaseType->getAs<RecordType>()) || 7848c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt (isArrow && BaseType->getAs<PointerType>() && 7849bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif !BaseType->getAs<PointerType>()->getPointeeType() 7850bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif ->template getAs<RecordType>())){ 785126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // This pseudo-destructor expression is still a pseudo-destructor. 78529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc, 785326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor isArrow? tok::arrow : tok::period, 7854fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SS, ScopeType, CCLoc, TildeLoc, 7855a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed, 785626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*FIXME?*/true); 785726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor } 78582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 7859a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 78602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 78612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 78622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 78632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.setNamedTypeInfo(DestroyedType); 78642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 786526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // FIXME: the ScopeType should be tacked onto SS. 78662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 78679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, BaseType, 786826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor OperatorLoc, isArrow, 786926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS, /*FIXME: FirstQualifier*/ 0, 78702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 787126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*TemplateArgs*/ 0); 787226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor} 787326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 7874577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 7875577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 7877