TreeTransform.h revision 0b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68
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 451694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 451794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NamedTL.setLAngleLoc(TL.getLAngleLoc()); 451894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NamedTL.setRAngleLoc(TL.getRAngleLoc()); 451994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 452094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I)); 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); 452694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } else { 452794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TypeLoc NewTL(Result, TL.getOpaqueData()); 452894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TLB.pushFullCopy(NewTL); 452994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } 453094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return Result; 453194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor} 453294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 453394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregortemplate<typename Derived> 45347536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorQualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 45357536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypeLoc TL) { 45362fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor QualType Pattern 45372fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor = getDerived().TransformType(TLB, TL.getPatternLoc()); 45382fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (Pattern.isNull()) 45392fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return QualType(); 45402fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 45412fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor QualType Result = TL.getType(); 45422fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (getDerived().AlwaysRebuild() || 45432fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor Pattern != TL.getPatternLoc().getType()) { 45442fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor Result = getDerived().RebuildPackExpansionType(Pattern, 45452fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor TL.getPatternLoc().getSourceRange(), 4546cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor TL.getEllipsisLoc(), 4547cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor TL.getTypePtr()->getNumExpansions()); 45482fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (Result.isNull()) 45492fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return QualType(); 45502fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor } 45512fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 45522fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 45532fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor NewT.setEllipsisLoc(TL.getEllipsisLoc()); 45542fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return Result; 45557536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 45567536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 45577536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregortemplate<typename Derived> 4558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 456043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCInterfaceTypeLoc TL) { 4561ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // ObjCInterfaceType is never dependent. 4562c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4563c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return TL.getType(); 4564c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 4565c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 4566c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived> 4567c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType 4568c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 456943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCObjectTypeLoc TL) { 4570c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // ObjCObjectType is never dependent. 4571c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4572ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return TL.getType(); 4573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 45741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 457843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCObjectPointerTypeLoc TL) { 4579ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // ObjCObjectPointerType is never dependent. 4580c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4581ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return TL.getType(); 458224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 458324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 4584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 458543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 458643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 458743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 458860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 45891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 45903fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 459143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 459243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 459343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 459460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 459543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 459643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 459743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 459843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 459943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 460060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 46011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 460243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 46037114cbab7eb6e8b714eb22f014327daf2c741c08John McCall bool SubStmtInvalid = false; 460443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 4605ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> Statements(getSema()); 460643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 460743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 460860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Result = getDerived().TransformStmt(*B); 46097114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (Result.isInvalid()) { 46107114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // Immediately fail if this was a DeclStmt, since it's very 46117114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // likely that this will cause problems for future statements. 46127114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (isa<DeclStmt>(*B)) 46137114cbab7eb6e8b714eb22f014327daf2c741c08John McCall return StmtError(); 46147114cbab7eb6e8b714eb22f014327daf2c741c08John McCall 46157114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // Otherwise, just keep processing substatements and fail later. 46167114cbab7eb6e8b714eb22f014327daf2c741c08John McCall SubStmtInvalid = true; 46177114cbab7eb6e8b714eb22f014327daf2c741c08John McCall continue; 46187114cbab7eb6e8b714eb22f014327daf2c741c08John McCall } 46191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 462043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 462143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 462243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 46231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46247114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (SubStmtInvalid) 46257114cbab7eb6e8b714eb22f014327daf2c741c08John McCall return StmtError(); 46267114cbab7eb6e8b714eb22f014327daf2c741c08John McCall 462743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 462843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 46293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 463043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 463143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 463243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 463343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 463443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 463543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 46361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 463743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 463860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 46391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 464060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS, RHS; 4641264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 4642264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 4643f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 46441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4645264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 4646264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 4647264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 4648f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4650264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 4651264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 4652264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 4653f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4654264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 46551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 465643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 465743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 465843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 465960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 46609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), 466143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 46629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get(), 466343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 466443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 4665f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 466743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 466860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 466943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4670f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 467243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 46739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 467443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 467543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 467643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 467760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 46781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 467943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 468060d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 468143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4682f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 468443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 468543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 46869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubStmt.get()); 468743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 468943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 469060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 46911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 469260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 469343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4694f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 46951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 469657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 469757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner S->getDecl()); 469857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 469957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return StmtError(); 470057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 470157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 470243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 4703ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner return getDerived().RebuildLabelStmt(S->getIdentLoc(), 470457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD), SourceLocation(), 470557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner SubStmt.get()); 470643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 47071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 470843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 470960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 47101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 471143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 471260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 47138cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 47148cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 4715c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 47168cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 4717aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 4718aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 4719aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 47208cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 4721f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 472299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 47238cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 4724c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 472599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 4726f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4727eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 4728eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor // Convert the condition to a boolean value. 4729afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 47308491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(), 47318491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 4732afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 4733f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4734eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 47359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE.get(); 4736afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 473799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 4738c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 47399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 47409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 4741f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4742eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 474343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 474460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Then = getDerived().TransformStmt(S->getThen()); 474543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 4746f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 47471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 474843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 474960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Else = getDerived().TransformStmt(S->getElse()); 475043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 4751f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 47521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 475343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 47549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 475599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 475643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 475743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 47583fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 47591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4760eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 476144aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis Then.get(), 47629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall S->getElseLoc(), Else.get()); 476343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 476443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 476543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 476660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 47671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 476843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 476960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 4770d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor VarDecl *ConditionVar = 0; 4771d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (S->getConditionVariable()) { 4772c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 4773d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor = cast_or_null<VarDecl>( 4774aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 4775aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 4776aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 4777d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (!ConditionVar) 4778f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 477999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 4780d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 4781c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 478299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 4783f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 478499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 47851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 478643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 478760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Switch 47889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(), 4789586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor ConditionVar); 479043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 4791f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 47921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 479343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 479460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 479543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 4796f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 47971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 479843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 47999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 48009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 480143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 48021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 480343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 480460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 48051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 480643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 480760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 48085656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor VarDecl *ConditionVar = 0; 48095656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (S->getConditionVariable()) { 4810c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 48115656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor = cast_or_null<VarDecl>( 4812aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 4813aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 4814aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 48155656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (!ConditionVar) 4816f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 481799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 48185656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 4819c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 482099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 4821f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4822afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 4823afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 4824afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor // Convert the condition to a boolean value. 48258491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(), 48268491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 4827afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 4828f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE; 4830afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 483199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 48321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 48349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 4835f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4836eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 483743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 483860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 483943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 4840f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 484243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 48439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 484499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 484543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 48469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return Owned(S); 48471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4848eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, 48499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall ConditionVar, Body.get()); 485043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 48511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 485243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 485360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 485443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 485543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 485660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 485743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 4858f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4860eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor // Transform the condition 486160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(S->getCond()); 4862eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor if (Cond.isInvalid()) 4863f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4864eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 486543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 486643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 486743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 48683fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 48691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 48719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall /*FIXME:*/S->getWhileLoc(), Cond.get(), 487243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 487343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 48741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 487543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 487660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 48771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 487843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 487960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Init = getDerived().TransformStmt(S->getInit()); 488043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 4881f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 48821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 488343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 488460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 488599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *ConditionVar = 0; 488699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (S->getConditionVariable()) { 4887c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 488899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor = cast_or_null<VarDecl>( 4889aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 4890aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 4891aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 489299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (!ConditionVar) 4893f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 489499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 489599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 4896c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 489799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 4898f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4899afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 4900afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 4901afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor // Convert the condition to a boolean value. 49028491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(), 49038491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 4904afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 4905f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4906afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 49079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE.get(); 4908afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 490999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 49101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 49129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 4913f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4914eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 491543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 491660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Inc = getDerived().TransformExpr(S->getInc()); 491743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 4918f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get())); 49219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (S->getInc() && !FullInc.get()) 4922f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4923eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 492443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 492560d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 492643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 4927f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 492943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 493043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 49319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 493243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 493343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 49343fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 49351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 493643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 49379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init.get(), FullCond, ConditionVar, 49389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullInc, S->getRParenLoc(), Body.get()); 493943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 494043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 494143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 494260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 494457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 494557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner S->getLabel()); 494657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 494757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return StmtError(); 494857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 494943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 49501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 495157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD)); 495243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 495343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 495443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 495560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 495760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Target = getDerived().TransformExpr(S->getTarget()); 495843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 4959f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 496143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 496243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 49633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 496443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 496543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 49669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Target.get()); 496743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 496843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 496943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 497060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 49723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 497343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 49741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 497543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 497660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 49783fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 497943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 49801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 498143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 498260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 498460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(S->getRetValue()); 498543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 4986f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 498743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 49881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 498943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 49909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 499143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 49921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 499343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 499460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 499643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 499743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 499843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 499943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 5000aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), 5001aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor *D); 500243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 5003f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 50041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 500543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 500643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 50071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 500843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 500943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 50101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 501143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 50123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 50131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 501543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 501643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 50171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 501843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 501960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 502043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 5021c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5022ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Constraints(getSema()); 5023ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Exprs(getSema()); 5024ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson llvm::SmallVector<IdentifierInfo *, 4> Names; 5025a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 502660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult AsmString; 5027ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Clobbers(getSema()); 5028703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5029703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool ExprsChanged = false; 5030c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5031703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the outputs. 5032703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 5033ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getOutputIdentifier(I)); 5034c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5035703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 50363fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Constraints.push_back(S->getOutputConstraintLiteral(I)); 5037c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5038703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the output expr. 5039703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *OutputExpr = S->getOutputExpr(I); 504060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(OutputExpr); 5041703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 5042f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5043c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5044703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != OutputExpr; 5045c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 50469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Exprs.push_back(Result.get()); 5047703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 5048c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5049703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the inputs. 5050703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 5051ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getInputIdentifier(I)); 5052c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5053703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 50543fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Constraints.push_back(S->getInputConstraintLiteral(I)); 5055c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5056703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the input expr. 5057703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *InputExpr = S->getInputExpr(I); 505860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(InputExpr); 5059703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 5060f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5061c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5062703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != InputExpr; 5063c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 50649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Exprs.push_back(Result.get()); 5065703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 5066c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5067703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (!getDerived().AlwaysRebuild() && !ExprsChanged) 50683fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5069703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5070703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the clobbers. 5071703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 50723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Clobbers.push_back(S->getClobber(I)); 5073703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5074703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the asm string literal. 5075703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson AsmString = SemaRef.Owned(S->getAsmString()); 5076703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5077703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return getDerived().RebuildAsmStmt(S->getAsmLoc(), 5078703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isSimple(), 5079703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isVolatile(), 5080703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumOutputs(), 5081703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumInputs(), 5082a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson Names.data(), 5083703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Constraints), 5084703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Exprs), 50859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall AsmString.get(), 5086703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Clobbers), 5087703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getRParenLoc(), 5088703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isMSAsm()); 508943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 509043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 509143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 509243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 509360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 50941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 50954dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the body of the @try. 509660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 50974dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (TryBody.isInvalid()) 5098f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5099c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 51008f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor // Transform the @catch statements (if present). 51018f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor bool AnyCatchChanged = false; 5102ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> CatchStmts(SemaRef); 51038f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 510460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 51054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Catch.isInvalid()) 5106f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 51078f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor if (Catch.get() != S->getCatchStmt(I)) 51088f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor AnyCatchChanged = true; 51098f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor CatchStmts.push_back(Catch.release()); 51104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 5111c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 51124dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the @finally statement (if present). 511360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Finally; 51144dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (S->getFinallyStmt()) { 51154dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Finally = getDerived().TransformStmt(S->getFinallyStmt()); 51164dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Finally.isInvalid()) 5117f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 51184dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 51194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 51204dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // If nothing changed, just retain this statement. 51214dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (!getDerived().AlwaysRebuild() && 51224dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor TryBody.get() == S->getTryBody() && 51238f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor !AnyCatchChanged && 51244dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Finally.get() == S->getFinallyStmt()) 51253fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5126c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 51274dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Build a new statement. 51289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 51299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall move_arg(CatchStmts), Finally.get()); 513043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 51311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 513243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 513360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 51341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 5135be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor // Transform the @catch parameter, if there is one. 5136be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *Var = 0; 5137be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (VarDecl *FromVar = S->getCatchParamDecl()) { 5138be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TypeSourceInfo *TSInfo = 0; 5139be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (FromVar->getTypeSourceInfo()) { 5140be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 5141be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (!TSInfo) 5142f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5143be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5144c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5145be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor QualType T; 5146be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (TSInfo) 5147be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor T = TSInfo->getType(); 5148be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor else { 5149be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor T = getDerived().TransformType(FromVar->getType()); 5150be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (T.isNull()) 5151f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5152be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5153c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5154be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 5155be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (!Var) 5156f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5157be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5158c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 515960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 5160be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (Body.isInvalid()) 5161f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5162c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5163c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 5164be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor S->getRParenLoc(), 51659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Var, Body.get()); 516643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 516843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 516960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 51701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 51714dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the body. 517260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 51734dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Body.isInvalid()) 5174f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5175c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 51764dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // If nothing changed, just retain this statement. 51774dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (!getDerived().AlwaysRebuild() && 51784dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Body.get() == S->getFinallyBody()) 51793fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 51804dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 51814dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Build a new statement. 51824dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 51839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 518443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 51851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 518643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 518760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 51881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 518960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Operand; 5190d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (S->getThrowExpr()) { 5191d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor Operand = getDerived().TransformExpr(S->getThrowExpr()); 5192d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (Operand.isInvalid()) 5193f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5194d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor } 5195c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5196d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (!getDerived().AlwaysRebuild() && 5197d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor Operand.get() == S->getThrowExpr()) 51983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return getSema().Owned(S); 5199c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 52009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 520143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 52021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 520343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 520460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 520543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 52061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 52078fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Transform the object we are locking. 520860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 52098fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (Object.isInvalid()) 5210f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5211c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 52128fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Transform the body. 521360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 52148fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (Body.isInvalid()) 5215f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5216c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 52178fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // If nothing change, just retain the current statement. 52188fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (!getDerived().AlwaysRebuild() && 52198fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor Object.get() == S->getSynchExpr() && 52208fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor Body.get() == S->getSynchBody()) 52213fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 52228fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor 52238fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Build a new statement. 52248fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 52259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Object.get(), Body.get()); 522643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 522743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 522843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 522960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 523043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 5232c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the element statement. 523360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Element = getDerived().TransformStmt(S->getElement()); 5234c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Element.isInvalid()) 5235f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5236c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5237c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the collection expression. 523860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 5239c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Collection.isInvalid()) 5240f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5241c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5242c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the body. 524360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 5244c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Body.isInvalid()) 5245f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5246c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5247c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // If nothing changed, just retain this statement. 5248c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (!getDerived().AlwaysRebuild() && 5249c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Element.get() == S->getElement() && 5250c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Collection.get() == S->getCollection() && 5251c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Body.get() == S->getBody()) 52523fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5253c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5254c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Build a new statement. 5255c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 5256c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /*FIXME:*/S->getForLoc(), 52579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Element.get(), 52589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Collection.get(), 5259c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor S->getRParenLoc(), 52609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 526143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 526243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 526343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 526443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 526560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 526643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 526743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 526843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 526943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 527043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 527183cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor TypeSourceInfo *T = getDerived().TransformType( 527283cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor ExceptionDecl->getTypeSourceInfo()); 527383cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor if (!T) 5274f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 52751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 527683cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T, 527743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 527883cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor ExceptionDecl->getLocation()); 5279ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor if (!Var || Var->isInvalidDecl()) 5280f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 528143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 52821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 528343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 528460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 5285ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor if (Handler.isInvalid()) 5286f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 52871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 528843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 528943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 529043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 52913fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 529243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 529343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 529443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 52959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Handler.get()); 529643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 52971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 529843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 529960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 530043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 530143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 530260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TryBlock 530343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 530443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 5305f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 53061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 530743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 530843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 5309ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> Handlers(SemaRef); 531043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 531160d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Handler 531243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 531343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 5314f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 53151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 531643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 531743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 531843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 53191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 532043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 532143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 532243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 53233fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 532443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 53259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 53261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 532743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 53281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 532943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 5330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 5331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 53321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 533360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5334454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 53353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 53361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 53371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 533960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5340454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 534140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc; 534240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (E->getQualifierLoc()) { 534340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc 534440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 534540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (!QualifierLoc) 5346f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5347a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 5348dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 5349dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *ND 53507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 53517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getDecl())); 5352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 5353f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 53541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5355ec8045d3f0375302eadaa63deb373bacaf25a569John McCall DeclarationNameInfo NameInfo = E->getNameInfo(); 5356ec8045d3f0375302eadaa63deb373bacaf25a569John McCall if (NameInfo.getName()) { 5357ec8045d3f0375302eadaa63deb373bacaf25a569John McCall NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 5358ec8045d3f0375302eadaa63deb373bacaf25a569John McCall if (!NameInfo.getName()) 5359f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5360ec8045d3f0375302eadaa63deb373bacaf25a569John McCall } 53612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 53622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!getDerived().AlwaysRebuild() && 536340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc == E->getQualifierLoc() && 5364a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 53652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getDecl()->getDeclName() && 5366096832c5ed5b9106fa177ebc148489760c3bc496John McCall !E->hasExplicitTemplateArgs()) { 53671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5368dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // Mark it referenced in the new context regardless. 5369dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: this is a bit instantiation-specific. 5370dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 5371a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 53723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5373a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 5374dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 5375dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 5376096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (E->hasExplicitTemplateArgs()) { 5377dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgs = &TransArgs; 5378dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 5379dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 5380fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 5381fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 5382fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 5383fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 5384dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 5385dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 538640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 538740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor TemplateArgs); 5388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 539160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5392454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 53933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 53951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 539760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5398454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 53993fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 540360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5404454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 54053fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 540960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5410454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 54113fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 541560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5416454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 54173fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 542160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5422454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 542360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 5424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5425f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 54261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 54283fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 54291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 5431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 5432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 54341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 543560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5436454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *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 5444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 5445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 54469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get()); 5447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 545060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 54518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 54528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Transform the type. 54538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 54548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!Type) 5455f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5456c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Transform all of the components into components similar to what the 54588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // parser uses. 5459c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // FIXME: It would be slightly more efficient in the non-dependent case to 5460c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // just map FieldDecls, rather than requiring the rebuilder to look for 5461c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // the fields again. However, __builtin_offsetof is rare enough in 54628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // template code that we don't care. 54638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool ExprChanged = false; 5464f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall typedef Sema::OffsetOfComponent Component; 54658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor typedef OffsetOfExpr::OffsetOfNode Node; 54668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor llvm::SmallVector<Component, 4> Components; 54678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 54688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const Node &ON = E->getComponent(I); 54698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Component Comp; 547072be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor Comp.isBrackets = true; 54718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.LocStart = ON.getRange().getBegin(); 54728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.LocEnd = ON.getRange().getEnd(); 54738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor switch (ON.getKind()) { 54748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Array: { 54758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 547660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Index = getDerived().TransformExpr(FromIndex); 54778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (Index.isInvalid()) 5478f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5479c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor ExprChanged = ExprChanged || Index.get() != FromIndex; 54818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.isBrackets = true; 54829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Comp.U.E = Index.get(); 54838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 54848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Field: 54878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Identifier: 54888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.isBrackets = false; 54898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.U.IdentInfo = ON.getFieldName(); 549029d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor if (!Comp.U.IdentInfo) 549129d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor continue; 5492c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 5494c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5495cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor case Node::Base: 5496cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Will be recomputed during the rebuild. 5497cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor continue; 54988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5499c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Components.push_back(Comp); 55018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5502c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // If nothing changed, retain the existing expression. 55048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!getDerived().AlwaysRebuild() && 55058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Type == E->getTypeSourceInfo() && 55068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor !ExprChanged) 55073fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5508c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Build a new offsetof expression. 55108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 55118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Components.data(), Components.size(), 55128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor E->getRParenLoc()); 55137cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall} 55147cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall 55157cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCalltemplate<typename Derived> 55167cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallExprResult 55177cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallTreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 55187cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall assert(getDerived().AlreadyTransformed(E->getType()) && 55197cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall "opaque value expression requires transformation"); 55207cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall return SemaRef.Owned(E); 55218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 55228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 55238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived> 552460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5525454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 5526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 5527a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 55285557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 5529a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 55305ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 5531f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 55321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55335ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 55343fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 55351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55365ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 55371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 5538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 5539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 554160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr; 55421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 5543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 5544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 5545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 5546f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 55471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5550f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 55511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 55533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 55551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildSizeOfAlignOf(SubExpr.get(), E->getOperatorLoc(), 5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 5559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 55601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 556260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5563454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 556460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 5566f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 55671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 556860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 5569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 5570f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 55711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 5575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 55763fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 55771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildArraySubscriptExpr(LHS.get(), 5579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 55809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get(), 5581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 5582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 55831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 558560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5586454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 5587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 558860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 5589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 5590f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 5593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 5594ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 5595aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 5596aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgChanged)) 5597aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 5598aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 5599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 5601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 56023fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 56031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 56051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 5606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 56079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 5608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 5609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 56111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 561360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5614454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 561560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 5616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 5617f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 561940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc; 562083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 562140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc 562240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 562340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor 562440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (!QualifierLoc) 5625f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 562683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 56271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5628f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member 56297c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 56307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getMemberDecl())); 5631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 5632f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56346bb8017bb9e828d118e15e59d71c66bba323c364John McCall NamedDecl *FoundDecl = E->getFoundDecl(); 56356bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (FoundDecl == E->getMemberDecl()) { 56366bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl = Member; 56376bb8017bb9e828d118e15e59d71c66bba323c364John McCall } else { 56386bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl = cast_or_null<NamedDecl>( 56396bb8017bb9e828d118e15e59d71c66bba323c364John McCall getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 56406bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!FoundDecl) 5641f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56426bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 56436bb8017bb9e828d118e15e59d71c66bba323c364John McCall 5644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 564640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc == E->getQualifierLoc() && 56478a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member == E->getMemberDecl() && 56486bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl == E->getFoundDecl() && 5649096832c5ed5b9106fa177ebc148489760c3bc496John McCall !E->hasExplicitTemplateArgs()) { 5650c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 56511f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // Mark it referenced in the new context regardless. 56521f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // FIXME: this is a bit instantiation-specific. 56531f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member); 56543fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 56551f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson } 5656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5657d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 5658096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (E->hasExplicitTemplateArgs()) { 5659d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 5660d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 5661fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 5662fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 5663fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 5664fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 56658a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 5666c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 5668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 5669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 5670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5671c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 5672c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 5673c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 5674c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 5675c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 5676c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 56779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 5678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 567940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc, 56802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara E->getMemberNameInfo(), 56818a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 56826bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl, 5683096832c5ed5b9106fa177ebc148489760c3bc496John McCall (E->hasExplicitTemplateArgs() 5684d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 5685c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope); 5686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 56871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 568960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5690454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 569160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 5692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 5693f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 569560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 5696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 5697f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 5701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 57023fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 57031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 57059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), RHS.get()); 5706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 57081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 570960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 5711454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CompoundAssignOperator *E) { 5712454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformBinaryOperator(E); 5713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 571656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallExprResult TreeTransform<Derived>:: 571756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallTransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 571856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // Just rebuild the common and RHS expressions and see whether we 571956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // get any changes. 572056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 572156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 572256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (commonExpr.isInvalid()) 572356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return ExprError(); 572456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 572556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 572656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (rhs.isInvalid()) 572756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return ExprError(); 572856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 572956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (!getDerived().AlwaysRebuild() && 573056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall commonExpr.get() == e->getCommon() && 573156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs.get() == e->getFalseExpr()) 573256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return SemaRef.Owned(e); 573356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 573456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return getDerived().RebuildConditionalOperator(commonExpr.take(), 573556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall e->getQuestionLoc(), 573656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 0, 573756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall e->getColonLoc(), 573856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs.get()); 573956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 574056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 574156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCalltemplate<typename Derived> 574260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5743454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 574460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(E->getCond()); 5745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 5746f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 574860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 5749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 5750f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 575260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 5753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 5754f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 5758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 5759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 57603fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 57611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildConditionalOperator(Cond.get(), 576347e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 57649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), 576547e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 57669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get()); 5767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 577060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5771454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 5772a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // Implicit casts are eliminated during transformation, since they 5773a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // will be recomputed by semantic analysis after transformation. 57746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return getDerived().TransformExpr(E->getSubExprAsWritten()); 5775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 577860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5779454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 5780ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 5781ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 5782ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 5783ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor 578460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 57856eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 5786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5787f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5790ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 5791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 57923fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 57931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 5795ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type, 5796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 57979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get()); 5798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 580160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5802454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 580342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *OldT = E->getTypeSourceInfo(); 580442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 580542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall if (!NewT) 5806f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 580860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 5809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 5810f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 581342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall OldT == NewT && 5814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 58153fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 58171d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // Note: the expression type doesn't necessarily match the 58181d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // type-as-written, but that's okay, because it should always be 58191d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // derivable from the initializer. 58201d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall 582142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 5822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 58239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init.get()); 5824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 582760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5828454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 582960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 5830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 5831f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 58353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 58361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 58381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 5839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 58409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 5841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 5842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 5843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 584660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5847454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 5848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 58491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5850ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> Inits(SemaRef); 5851aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 5852aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Inits, &InitChanged)) 5853aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 5854aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 5855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 58563fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 58571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 5859e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 5860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 586360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5864454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 5865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 58661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 586743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 586860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init = getDerived().TransformExpr(E->getInit()); 5869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 5870f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 587243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 5873ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef); 5874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 5875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 5876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 5877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 5878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 5879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 5880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 5881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 5882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 5883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 58841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 588660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 5887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 5888f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 5891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 58921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 5894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 5895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 5896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 58971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 589960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Start 5900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 5901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 5902f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 590460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 5905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 5906f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 5909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 5910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 5911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 59121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 5914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 59151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 5917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 5918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 59191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 5922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 59233fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 59241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 5926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 59279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall E->usesGNUSyntax(), Init.get()); 5928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 593160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 5933454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ImplicitValueInitExpr *E) { 59345557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 5935c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 59365557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 59375557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 5938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 5939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 5940f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 59443fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 59451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 5947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 595060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5951454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 59529bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 59539bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor if (!TInfo) 5954f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 595660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 5957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5958f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 59612cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TInfo == E->getWrittenTypeInfo() && 5962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 59633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 59641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 59662cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TInfo, E->getRParenLoc()); 5967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 597060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5971454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 5972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5973ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> Inits(SemaRef); 5974aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 5975aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 5976aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 5977aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 5978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 5979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 5980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 5984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 5985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 5986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 5987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 5988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 598960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5990454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 599157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 599257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner E->getLabel()); 599357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 599457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return ExprError(); 599557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 5996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 599757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD)); 5998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 600160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6002454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 600360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt 6004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 6005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 6006f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 60103fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 60111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 60139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubStmt.get(), 6014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 601860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6019454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 602060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(E->getCond()); 6021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 6022f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 602460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 6026f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 602860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 6030f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 6034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 6035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 60363fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 60371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 60399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond.get(), LHS.get(), RHS.get(), 6040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 604460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6045454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 60463fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 605060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6051454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 6052668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor switch (E->getOperator()) { 6053668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_New: 6054668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Delete: 6055668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_New: 6056668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_Delete: 6057668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 6058f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6059c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6060668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Call: { 6061668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // This is a call to an object's operator(). 6062668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 6063668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6064668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the object itself. 606560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 6066668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Object.isInvalid()) 6067f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6068668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6069668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor location information 6070668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeLParenLoc 6071668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 6072668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Object.get())->getLocEnd()); 6073668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6074668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the call arguments. 6075ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6076aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 6077aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args)) 6078aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6079668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 60809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 6081668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor move_arg(Args), 6082668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor E->getLocEnd()); 6083668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 6084668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6085668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 6086668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_##Name: 6087668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 6088668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def" 6089668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Subscript: 6090668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Handled below. 6091668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor break; 6092668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6093668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Conditional: 6094668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("conditional operator is not actually overloadable"); 6095f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6096668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6097668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_None: 6098668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case NUM_OVERLOADED_OPERATORS: 6099668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("not an overloaded operator?"); 6100f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6101668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 6102668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 610360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 6104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 6105f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 610760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult First = getDerived().TransformExpr(E->getArg(0)); 6108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 6109f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 611160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Second; 6112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 6113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 6114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 6115f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 61171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 6120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 61211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 61223fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 61231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 6125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 61269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Callee.get(), 61279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall First.get(), 61289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second.get()); 6129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 61301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 613260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6133454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 6134454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCallExpr(E); 6135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 61361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 6138e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneExprResult 6139e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneTreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 6140e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform the callee. 6141e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 6142e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (Callee.isInvalid()) 6143e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6144e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6145e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform exec config. 6146e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 6147e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (EC.isInvalid()) 6148e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6149e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6150e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform arguments. 6151e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne bool ArgChanged = false; 6152e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ASTOwningVector<Expr*> Args(SemaRef); 6153e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6154e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne &ArgChanged)) 6155e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6156e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6157e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (!getDerived().AlwaysRebuild() && 6158e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne Callee.get() == E->getCallee() && 6159e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne !ArgChanged) 6160e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return SemaRef.Owned(E); 6161e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6162e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // FIXME: Wrong source location information for the '('. 6163e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne SourceLocation FakeLParenLoc 6164e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne = ((Expr *)Callee.get())->getSourceRange().getBegin(); 6165e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 6166e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne move_arg(Args), 6167e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne E->getRParenLoc(), EC.get()); 6168e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne} 6169e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6170e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournetemplate<typename Derived> 617160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6172454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 6173ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6174ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 6175ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 6176ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor 617760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 61786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 6179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6180f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6183ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 6184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 61853fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 61861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 61881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 6189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 6190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 6191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 6192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 6193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 6194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 61951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 6196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 6197ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type, 6198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 6199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 62009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 6202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 620560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6206454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 6207454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 621160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6212454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 6213454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 621760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 6219454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXReinterpretCastExpr *E) { 6220454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 622460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6225454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 6226454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 623060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 6232454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXFunctionalCastExpr *E) { 6233ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6234ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 6235ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 62361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 623760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 62386eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 6239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6240f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6243ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 6244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 62453fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6247ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr(Type, 6248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 62499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 625460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6255454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 6256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 625757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *TInfo 625857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor = getDerived().TransformType(E->getTypeOperandSourceInfo()); 625957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor if (!TInfo) 6260f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 626357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TInfo == E->getTypeOperandSourceInfo()) 62643fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 626657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getType(), 626757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor E->getLocStart(), 626857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TInfo, 6269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 62711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 6273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 6274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 62751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 6276f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::PotentiallyPotentiallyEvaluated); 62771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 627860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 6279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6280f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 62843fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 628657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getType(), 628757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor E->getLocStart(), 62889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 629360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 629401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetTreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 629501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (E->isTypeOperand()) { 629601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TypeSourceInfo *TInfo 629701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet = getDerived().TransformType(E->getTypeOperandSourceInfo()); 629801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!TInfo) 629901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return ExprError(); 630001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 630101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!getDerived().AlwaysRebuild() && 630201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TInfo == E->getTypeOperandSourceInfo()) 63033fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 630401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 630501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getDerived().RebuildCXXTypeidExpr(E->getType(), 630601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocStart(), 630701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TInfo, 630801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocEnd()); 630901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 631001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 631101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // We don't know whether the expression is potentially evaluated until 631201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // after we perform semantic analysis, so the expression is potentially 631301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // potentially evaluated. 631401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 631501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 631601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 631701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (SubExpr.isInvalid()) 631801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return ExprError(); 631901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 632001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!getDerived().AlwaysRebuild() && 632101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SubExpr.get() == E->getExprOperand()) 63223fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 632301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 632401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getDerived().RebuildCXXUuidofExpr(E->getType(), 632501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocStart(), 632601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SubExpr.get(), 632701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocEnd()); 632801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet} 632901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 633001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichettemplate<typename Derived> 633101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetExprResult 6332454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 63333fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 633760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 6339454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXNullPtrLiteralExpr *E) { 63403fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 634460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6345454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 6346ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor DeclContext *DC = getSema().getFunctionLevelDeclContext(); 6347ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC); 6348ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor QualType T = MD->getThisType(getSema().Context); 63491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6350ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!getDerived().AlwaysRebuild() && T == E->getType()) 63513fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 63521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6353828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 6354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 635760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6358454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 635960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 6360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6361f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 63621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 63653fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 63679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get()); 6368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 637160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6372454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 63731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 63747c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 63757c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getParam())); 6376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 6377f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 63781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 637953cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth if (!getDerived().AlwaysRebuild() && 6380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 63813fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 63821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6383036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 6384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 638760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6388ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr( 6389ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXScalarValueInitExpr *E) { 6390ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 6391ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 6392f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6393ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 6394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6395ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo()) 63963fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 63971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6398ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXScalarValueInitExpr(T, 6399ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /*FIXME:*/T->getTypeLoc().getEndLoc(), 6400ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor E->getRParenLoc()); 6401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 64021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 640460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6405454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 6406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 64071bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *AllocTypeInfo 64081bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor = getDerived().TransformType(E->getAllocatedTypeSourceInfo()); 64091bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor if (!AllocTypeInfo) 6410f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 641360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 6414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 6415f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 6418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6419ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> PlacementArgs(SemaRef); 6420aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getPlacementArgs(), 6421aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor E->getNumPlacementArgs(), true, 6422aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor PlacementArgs, &ArgumentChanged)) 6423aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 64241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 642543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 6426ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(SemaRef); 6427aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getConstructorArgs(), E->getNumConstructorArgs(), true, 6428aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor ConstructorArgs, &ArgumentChanged)) 6429aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 64301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform constructor, new operator, and delete operator. 64321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor CXXConstructorDecl *Constructor = 0; 64331af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getConstructor()) { 64341af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor = cast_or_null<CXXConstructorDecl>( 64357c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 64367c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 64371af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!Constructor) 6438f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64391af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 64401af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 64411af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorNew = 0; 64421af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorNew()) { 64431af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew = cast_or_null<FunctionDecl>( 64447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 64457c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorNew())); 64461af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorNew) 6447f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64481af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 64491af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 64501af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 64511af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 64521af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 64537c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 64547c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 64551af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 6456f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 6458c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 64601bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 6461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 64621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor == E->getConstructor() && 64631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew == E->getOperatorNew() && 64641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete() && 64651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor !ArgumentChanged) { 64661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 64671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 64681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (Constructor) 64691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 64701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorNew) 64711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew); 64721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 64731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 64743fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 64751af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 64761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64771bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor QualType AllocType = AllocTypeInfo->getType(); 64785b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArraySize.get()) { 64795b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // If no array size was specified, but the new expression was 64805b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with an array type (e.g., "new T" where T is 64815b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with "int[4]"), extract the outer bound from the 64825b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // array type as our array size. We do this with constant and 64835b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // dependently-sized array types. 64845b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 64855b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArrayT) { 64865b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // Do nothing 64875b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const ConstantArrayType *ConsArrayT 64885b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<ConstantArrayType>(ArrayT)) { 6489c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ArraySize 64909996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context, 64919996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis ConsArrayT->getSize(), 64929996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis SemaRef.Context.getSizeType(), 64939996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis /*FIXME:*/E->getLocStart())); 64945b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = ConsArrayT->getElementType(); 64955b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const DependentSizedArrayType *DepArrayT 64965b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<DependentSizedArrayType>(ArrayT)) { 64975b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (DepArrayT->getSizeExpr()) { 64983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()); 64995b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = DepArrayT->getElementType(); 65005b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 65015b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 65025b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 65031bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor 6504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 6505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 6506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 6507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 6508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 65094bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor E->getTypeIdParens(), 6510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 65111bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocTypeInfo, 65129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall ArraySize.get(), 6513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 6514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 65151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 6516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 651960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6520454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 652160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 6522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 6523f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65251af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform the delete operator, if known. 65261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 65271af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 65281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 65297c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 65307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 65311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 6532f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65331af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 6534c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 65361af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Operand.get() == E->getArgument() && 65371af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete()) { 65381af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 65391af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 65401af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 65411af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 65425833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor 65435833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor if (!E->getArgument()->isTypeDependent()) { 65445833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor QualType Destroyed = SemaRef.Context.getBaseElementType( 65455833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor E->getDestroyedType()); 65465833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 65475833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 65485833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), 65495833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor SemaRef.LookupDestructor(Record)); 65505833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor } 65515833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor } 65525833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor 65533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 65541af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 65551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 6557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 6558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 65599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Operand.get()); 6560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 656360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6564a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 6565454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXPseudoDestructorExpr *E) { 656660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 6567a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 6568f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6570b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ObjectTypePtr; 6571a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor bool MayBePseudoDestructor = false; 65729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 6573a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getOperatorLoc(), 6574a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->isArrow()? tok::arrow : tok::period, 6575a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectTypePtr, 6576a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor MayBePseudoDestructor); 6577a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (Base.isInvalid()) 6578f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6579c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6580b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall QualType ObjectType = ObjectTypePtr.get(); 6581f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 6582f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor if (QualifierLoc) { 6583f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor QualifierLoc 6584f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 6585f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor if (!QualifierLoc) 658643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return ExprError(); 658743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } 6588f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor CXXScopeSpec SS; 6589f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SS.Adopt(QualifierLoc); 65901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6591a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed; 6592a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (E->getDestroyedTypeInfo()) { 6593a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedTypeInfo 659443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 6595b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor ObjectType, 0, SS); 6596a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!DestroyedTypeInfo) 6597f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6598a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = DestroyedTypeInfo; 6599a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else if (ObjectType->isDependentType()) { 6600a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // We aren't likely to be able to resolve the identifier down to a type 6601a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // now anyway, so just retain the identifier. 6602a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 6603a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 6604a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else { 6605a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // Look for a destructor known with the given name. 6606b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 6607a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor *E->getDestroyedTypeIdentifier(), 6608a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc(), 6609a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /*Scope=*/0, 6610a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS, ObjectTypePtr, 6611a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor false); 6612a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!T) 6613f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6614c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6615a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed 6616a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 6617a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 6618a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 661926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 662026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeTypeInfo = 0; 662126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (E->getScopeTypeInfo()) { 662243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo()); 662326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (!ScopeTypeInfo) 6624f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6625a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 6626c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 66279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 6628a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 6629a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 6630f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SS, 663126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor ScopeTypeInfo, 663226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor E->getColonColonLoc(), 6633fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor E->getTildeLoc(), 6634a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed); 6635a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 66361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6637a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 663860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6639ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 6640454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall UnresolvedLookupExpr *Old) { 6641f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 6642f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Sema::LookupOrdinaryName); 6643f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6644f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Transform all the decls. 6645f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 6646f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = Old->decls_end(); I != E; ++I) { 66477c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 66487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getNameLoc(), 66497c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 66509f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 66519f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 66529f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 66539f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 66549f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 66559f54ad4381370c6b771424b53d219e661d6d6706John McCall else 6656f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 66579f54ad4381370c6b771424b53d219e661d6d6706John McCall } 6658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Expand using declarations. 6660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (isa<UsingDecl>(InstD)) { 6661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 6662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 6663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = UD->shadow_end(); I != E; ++I) 6664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(*I); 6665f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall continue; 6666f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6667f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6668f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(InstD); 6669f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6670f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6671f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Resolve a kind, but don't do any further analysis. If it's 6672f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // ambiguous, the callee needs to deal with it. 6673f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.resolveKind(); 6674f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6675f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Rebuild the nested-name qualifier, if present. 6676f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 66774c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (Old->getQualifierLoc()) { 66784c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc 66794c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 66804c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (!QualifierLoc) 6681f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6682c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 66834c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor SS.Adopt(QualifierLoc); 6684c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt } 6685c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6686c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor if (Old->getNamingClass()) { 668766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor CXXRecordDecl *NamingClass 668866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 668966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNameLoc(), 669066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNamingClass())); 669166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor if (!NamingClass) 6692f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6693c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 669466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor R.setNamingClass(NamingClass); 6695f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6696f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6697f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have no template arguments, it's a normal declaration name. 6698f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Old->hasExplicitTemplateArgs()) 6699f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 6700f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6701f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have template arguments, rebuild them, then rebuild the 6702f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // templateid expression. 6703f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 6704fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 6705fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor Old->getNumTemplateArgs(), 6706fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 6707fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 6708f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6709f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(), 6710f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs); 6711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 67121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 671460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6715454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 67163d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 67173d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor if (!T) 6718f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 67213d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor T == E->getQueriedTypeSourceInfo()) 67223fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 67231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 6725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 6726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 6727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 67291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 673160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 67326ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetTreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 67336ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo()); 67346ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!LhsT) 67356ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return ExprError(); 67366ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 67376ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo()); 67386ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!RhsT) 67396ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return ExprError(); 67406ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 67416ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!getDerived().AlwaysRebuild() && 67426ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo()) 67436ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return SemaRef.Owned(E); 67446ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 67456ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return getDerived().RebuildBinaryTypeTrait(E->getTrait(), 67466ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet E->getLocStart(), 67476ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet LhsT, RhsT, 67486ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet E->getLocEnd()); 67496ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet} 67506ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 67516ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichettemplate<typename Derived> 67526ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetExprResult 6753865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 67542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DependentScopeDeclRefExpr *E) { 675500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc 675600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 675700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor if (!QualifierLoc) 6758f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 676043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // TODO: If this is a conversion-function-id, verify that the 676143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // destination type name (if present) resolves the same way after 676243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // instantiation as it did in the local scope. 676343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 67642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo 67652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 67662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!NameInfo.getName()) 6767f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6769f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!E->hasExplicitTemplateArgs()) { 6770f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!getDerived().AlwaysRebuild() && 677100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor QualifierLoc == E->getQualifierLoc() && 67722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // Note: it is sufficient to compare the Name component of NameInfo: 67732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // if name has not changed, DNLoc has not changed either. 67742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getDeclName()) 67753fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 67761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 677700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 67782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 6779f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /*TemplateArgs*/ 0); 6780f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 6781d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 6782d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 6783fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 6784fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 6785fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 6786fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 6787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 678800cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 67892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 6790f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall &TransArgs); 6791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 679460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6795454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 6796321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // CXXConstructExprs are always implicit, so when we have a 6797321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // 1-argument construction we just transform that argument. 6798321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor if (E->getNumArgs() == 1 || 6799321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) 6800321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor return getDerived().TransformExpr(E->getArg(0)); 6801321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor 6802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 6803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 6805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 6806f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 6809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 68107c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 68117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 6812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 6813f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6816ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6817aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6818aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 6819aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6820aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 6821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 6823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 6824c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor !ArgumentChanged) { 68251af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark the constructor as referenced. 68261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: Instantiation-specific 6827c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 68283fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6829c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor } 68301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68314411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 68324411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor Constructor, E->isElidable(), 68338c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor move_arg(Args), 68348c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor E->requiresZeroInitialization(), 6835428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth E->getConstructionKind(), 6836428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth E->getParenRange()); 6837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 6840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 68415132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 68425132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that. 6843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 684460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6845454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 68465132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 6847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68494765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// \brief Transform a C++ expression that contains cleanups that should 68504765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// be run after the expression is evaluated. 6851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 68524765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// Since ExprWithCleanups nodes are implicitly generated, we 68535132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that. 6854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 685560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 68564765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallTreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 68575132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 6858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 686160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 6863ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXTemporaryObjectExpr *E) { 6864ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 6865ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 6866f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 6869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 6870c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt getDerived().TransformDecl(E->getLocStart(), 68717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 6872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 6873f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6876ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 6878aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6879aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 6880aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 68811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6883ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo() && 6884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 688591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor !ArgumentChanged) { 688691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // FIXME: Instantiation-specific 6887ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 68883fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.MaybeBindToTemporary(E); 688991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor } 6890ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 6891ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(T, 6892ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /*FIXME:*/T->getTypeLoc().getEndLoc(), 6893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 6894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 689860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 6900454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXUnresolvedConstructExpr *E) { 6901ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 6902ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 6903f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 69041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6906ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6907aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args.reserve(E->arg_size()); 6908aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 6909aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 6910aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6911aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 6912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6913ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo() && 6914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 69153fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 69161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 6918ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(T, 6919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 6920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 6921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 69231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 692560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6926865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 69272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara CXXDependentScopeMemberExpr *E) { 6928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 692960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base((Expr*) 0); 6930aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *OldBase; 6931aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 6932aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType ObjectType; 6933aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->isImplicitAccess()) { 6934aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = E->getBase(); 6935aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(OldBase); 6936aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 6937f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 69381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6939aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall // Start the member reference and compute the object's type. 6940b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ObjectTy; 6941d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor bool MayBePseudoDestructor = false; 69429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 6943aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall E->getOperatorLoc(), 6944a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 6945d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor ObjectTy, 6946d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor MayBePseudoDestructor); 6947aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 6948f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6949aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 6950b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ObjectType = ObjectTy.get(); 6951aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 6952aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 6953aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = 0; 6954aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(E->getBaseType()); 6955aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 6956aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 69571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 69596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 6960c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 69616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 69627c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor E->getFirstQualifierFoundInScope(), 69637c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor E->getQualifierLoc().getBeginLoc()); 69641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69657c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 6966a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 69677c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc 69687c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 69697c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor ObjectType, 69707c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor FirstQualifierInScope); 69717c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor if (!QualifierLoc) 6972f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6973a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 69741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 697543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // TODO: If this is a conversion-function-id, verify that the 697643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // destination type name (if present) resolves the same way after 697743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // instantiation as it did in the local scope. 697843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 69792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo 698043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 69812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!NameInfo.getName()) 6982f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 69831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6984aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->hasExplicitTemplateArgs()) { 69853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 69863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 69873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 6988aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base.get() == OldBase && 6989aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType == E->getBaseType() && 69907c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc == E->getQualifierLoc() && 69912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getMember() && 69923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 69933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 69941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 6996aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 69973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 69983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 69997c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc, 7000129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall FirstQualifierInScope, 70012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 7002129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /*TemplateArgs*/ 0); 70033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 70043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 7005d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 7006fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 7007fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 7008fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 7009fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 70101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 7012aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 7013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 7014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 70157c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc, 70163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 70172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 7018129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall &TransArgs); 7019129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 7020129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7021129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived> 702260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7023454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 7024129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform the base of the expression. 702560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base((Expr*) 0); 7026aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 7027aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Old->isImplicitAccess()) { 7028aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(Old->getBase()); 7029aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 7030f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7031aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 7032aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 7033aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(Old->getBaseType()); 7034aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 7035129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 70364c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 70374c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (Old->getQualifierLoc()) { 70384c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor QualifierLoc 70394c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 70404c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (!QualifierLoc) 7041f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7042129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7043129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 70442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara LookupResult R(SemaRef, Old->getMemberNameInfo(), 7045129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Sema::LookupOrdinaryName); 7046129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7047129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform all the decls. 7048129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 7049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = Old->decls_end(); I != E; ++I) { 70507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 70517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getMemberLoc(), 70527c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 70539f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 70549f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 70559f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 70569f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 70579f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 70589f54ad4381370c6b771424b53d219e661d6d6706John McCall else 7059f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 70609f54ad4381370c6b771424b53d219e661d6d6706John McCall } 7061129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7062129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Expand using declarations. 7063129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (isa<UsingDecl>(InstD)) { 7064129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 7065129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 7066129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = UD->shadow_end(); I != E; ++I) 7067129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(*I); 7068129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall continue; 7069129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7070129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7071129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(InstD); 7072129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7073129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7074129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.resolveKind(); 7075129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7076c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor // Determine the naming class. 7077042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth if (Old->getNamingClass()) { 7078c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt CXXRecordDecl *NamingClass 7079c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 708066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getMemberLoc(), 708166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNamingClass())); 708266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor if (!NamingClass) 7083f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7084c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 708566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor R.setNamingClass(NamingClass); 7086c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor } 7087c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7088129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentListInfo TransArgs; 7089129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->hasExplicitTemplateArgs()) { 7090129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setLAngleLoc(Old->getLAngleLoc()); 7091129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setRAngleLoc(Old->getRAngleLoc()); 7092fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 7093fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor Old->getNumTemplateArgs(), 7094fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 7095fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 7096129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7097c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 7098c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 7099c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 7100c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 7101c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 7102c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 7103c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 71049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 7105aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 7106129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getOperatorLoc(), 7107129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->isArrow(), 71084c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor QualifierLoc, 7109c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope, 7110129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R, 7111129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall (Old->hasExplicitTemplateArgs() 7112129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall ? &TransArgs : 0)); 7113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 711660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 71172e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlTreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 71182e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 71192e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl if (SubExpr.isInvalid()) 71202e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return ExprError(); 71212e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 71222e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 71233fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 71242e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 71252e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 71262e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl} 71272e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 71282e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redltemplate<typename Derived> 71292e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlExprResult 7130be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorTreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 71314f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 71324f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor if (Pattern.isInvalid()) 71334f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor return ExprError(); 71344f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 71354f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 71364f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor return SemaRef.Owned(E); 71374f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 713867fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 713967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor E->getNumExpansions()); 7140be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor} 7141ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7142ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregortemplate<typename Derived> 7143ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorExprResult 7144ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorTreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 7145ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // If E is not value-dependent, then nothing will change when we transform it. 7146ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // Note: This is an instantiation-centric view. 7147ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor if (!E->isValueDependent()) 7148ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return SemaRef.Owned(E); 7149ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7150ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // Note: None of the implementations of TryExpandParameterPacks can ever 7151ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // produce a diagnostic when given only a single unexpanded parameter pack, 7152ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // so 7153ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 7154ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor bool ShouldExpand = false; 7155d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 7156cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions; 7157ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 7158ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor &Unexpanded, 1, 7159d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ShouldExpand, RetainExpansion, 7160d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 7161ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return ExprError(); 7162ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7163d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (!ShouldExpand || RetainExpansion) 7164ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return SemaRef.Owned(E); 7165be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 7166ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // We now know the length of the parameter pack, so build a new expression 7167ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // that stores that length. 7168ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 7169ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor E->getPackLoc(), E->getRParenLoc(), 7170cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor *NumExpansions); 7171ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor} 7172ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7173be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregortemplate<typename Derived> 7174be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorExprResult 7175c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorTreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 7176c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SubstNonTypeTemplateParmPackExpr *E) { 7177c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor // Default behavior is to do nothing with this transformation. 7178c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor return SemaRef.Owned(E); 7179c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor} 7180c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 7181c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregortemplate<typename Derived> 7182c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorExprResult 7183454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 71843fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 71871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 718860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7189454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 719081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodedTypeInfo 719181d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 719281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor if (!EncodedTypeInfo) 7193f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 71941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 719681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 71973fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 720081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor EncodedTypeInfo, 7201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 7202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 72031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 720560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7206454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 720792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Transform arguments. 720892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor bool ArgChanged = false; 7209ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 7210aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args.reserve(E->getNumArgs()); 7211aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 7212aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgChanged)) 7213aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 7214aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 721592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (E->getReceiverKind() == ObjCMessageExpr::Class) { 721692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Class message: transform the receiver type. 721792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor TypeSourceInfo *ReceiverTypeInfo 721892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformType(E->getClassReceiverTypeInfo()); 721992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!ReceiverTypeInfo) 7220f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7221c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 722292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If nothing changed, just retain the existing message send. 722392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!getDerived().AlwaysRebuild() && 722492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 72253fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 722692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 722792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Build a new class message send. 722892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 722992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getSelector(), 7230f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis E->getSelectorLoc(), 723192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getMethodDecl(), 723292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getLeftLoc(), 723392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move_arg(Args), 723492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getRightLoc()); 723592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 723692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 723792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Instance message: transform the receiver 723892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 723992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor "Only class and instance messages may be instantiated"); 724060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Receiver 724192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformExpr(E->getInstanceReceiver()); 724292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Receiver.isInvalid()) 7243f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 724492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 724592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If nothing changed, just retain the existing message send. 724692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!getDerived().AlwaysRebuild() && 724792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 72483fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7249c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 725092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Build a new instance message send. 72519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCMessageExpr(Receiver.get(), 725292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getSelector(), 7253f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis E->getSelectorLoc(), 725492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getMethodDecl(), 725592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getLeftLoc(), 725692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move_arg(Args), 725792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getRightLoc()); 7258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 72601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 726160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7262454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 72633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 72661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 726760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7268454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 72693fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 72721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 727360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7274454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 7275f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // Transform the base expression. 727660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7277f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Base.isInvalid()) 7278f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7279f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 7280f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // We don't need to transform the ivar; it will never change. 7281c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7282f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // If nothing changed, just retain the existing expression. 7283f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (!getDerived().AlwaysRebuild() && 7284f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base.get() == E->getBase()) 72853fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7286c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 72879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 7288f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->getLocation(), 7289f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->isArrow(), E->isFreeIvar()); 7290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 72921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 729360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7294454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 729512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // 'super' and types never change. Property never changes. Just 729612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // retain the existing expression. 729712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (!E->isObjectReceiver()) 72983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 72998ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian 7300e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // Transform the base expression. 730160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7302e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Base.isInvalid()) 7303f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7304c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7305e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // We don't need to transform the property; it will never change. 7306c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7307e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // If nothing changed, just retain the existing expression. 7308e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (!getDerived().AlwaysRebuild() && 7309e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Base.get() == E->getBase()) 73103fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 731212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (E->isExplicitProperty()) 731312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 731412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getExplicitProperty(), 731512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getLocation()); 731612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall 731712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 731812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getType(), 731912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getImplicitPropertyGetter(), 732012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getImplicitPropertySetter(), 732112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getLocation()); 7322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 73241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 732560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7326454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 7327f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // Transform the base expression. 732860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7329f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Base.isInvalid()) 7330f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7331c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7332f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // If nothing changed, just retain the existing expression. 7333f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (!getDerived().AlwaysRebuild() && 7334f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base.get() == E->getBase()) 73353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7336c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 73379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 7338f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->isArrow()); 7339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 73411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 734260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7343454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 7344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 7345ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> SubExprs(SemaRef); 7346aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor SubExprs.reserve(E->getNumSubExprs()); 7347aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 7348aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor SubExprs, &ArgumentChanged)) 7349aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 73501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 7352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 73533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 73541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 7356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 7357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 7358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 73601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 736160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7362454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 7363c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall BlockDecl *oldBlock = E->getBlockDecl(); 7364a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 7365c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0); 7366c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 7367c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7368c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 7369c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall llvm::SmallVector<ParmVarDecl*, 4> params; 7370c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall llvm::SmallVector<QualType, 4> paramTypes; 7371a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 7372a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // Parameter substitution. 7373c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(), 7374c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->param_begin(), 7375c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->param_size(), 7376c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 0, paramTypes, ¶ms)) 7377a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor return true; 7378c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7379c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall const FunctionType *exprFunctionType = E->getFunctionType(); 7380c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall QualType exprResultType = exprFunctionType->getResultType(); 7381c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!exprResultType.isNull()) { 7382c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!exprResultType->isDependentType()) 7383c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = exprResultType; 7384c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall else if (exprResultType != getSema().Context.DependentTy) 7385c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = getDerived().TransformType(exprResultType); 7386a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian } 7387a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7388a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // If the return type has not been determined yet, leave it as a dependent 7389a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // type; it'll get set when we process the body. 7390c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType.isNull()) 7391c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = getSema().Context.DependentTy; 7392a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7393a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // Don't allow returning a objc interface by value. 7394c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType->isObjCObjectType()) { 7395c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall getSema().Diag(E->getCaretLocation(), 7396a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor diag::err_object_cannot_be_passed_returned_by_value) 7397c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall << 0 << blockScope->ReturnType; 7398a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor return ExprError(); 7399a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor } 7400711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7401c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall QualType functionType = getDerived().RebuildFunctionProtoType( 7402c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType, 7403c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall paramTypes.data(), 7404c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall paramTypes.size(), 7405c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->isVariadic(), 7406c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor 0, RQ_None, 7407c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall exprFunctionType->getExtInfo()); 7408c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->FunctionType = functionType; 7409711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7410711c52bb20d0c69063b52a99826fb7d2835501f1John McCall // Set the parameters on the block decl. 7411c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!params.empty()) 7412c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->TheDecl->setParams(params.data(), params.size()); 7413a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7414a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // If the return type wasn't explicitly set, it will have been marked as a 7415a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // dependent type (DependentTy); clear out the return type setting so 7416a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // we will deduce the return type when type-checking the block's body. 7417c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType == getSema().Context.DependentTy) 7418c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = QualType(); 7419a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7420711c52bb20d0c69063b52a99826fb7d2835501f1John McCall // Transform the body 7421c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall StmtResult body = getDerived().TransformStmt(E->getBody()); 7422c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (body.isInvalid()) 7423711c52bb20d0c69063b52a99826fb7d2835501f1John McCall return ExprError(); 7424711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7425c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#ifndef NDEBUG 7426c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // In builds with assertions, make sure that we captured everything we 7427c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // captured before. 7428c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7429c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (oldBlock->capturesCXXThis()) assert(blockScope->CapturesCXXThis); 7430c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7431c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall for (BlockDecl::capture_iterator i = oldBlock->capture_begin(), 7432c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall e = oldBlock->capture_end(); i != e; ++i) { 74336b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall VarDecl *oldCapture = i->getVariable(); 7434c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7435c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // Ignore parameter packs. 7436c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (isa<ParmVarDecl>(oldCapture) && 7437c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall cast<ParmVarDecl>(oldCapture)->isParameterPack()) 7438c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall continue; 7439c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7440c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall VarDecl *newCapture = 7441c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 7442c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldCapture)); 74436b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall assert(blockScope->CaptureMap.count(newCapture)); 7444c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall } 7445c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#endif 7446c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7447c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 7448c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall /*Scope=*/0); 7449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 74511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 745260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7453454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 7454a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian ValueDecl *ND 7455a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 7456a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian E->getDecl())); 7457a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian if (!ND) 7458f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 74592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 7460a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian if (!getDerived().AlwaysRebuild() && 7461a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian ND == E->getDecl()) { 7462a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // Mark it referenced in the new context regardless. 7463a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // FIXME: this is a bit instantiation-specific. 7464a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 7465a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 74663fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7467a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian } 7468a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 74692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation()); 747040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return getDerived().RebuildDeclRefExpr(NestedNameSpecifierLoc(), 74712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ND, NameInfo, 0); 7472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 74731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 7475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 7476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 7477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 74781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 747985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 748085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 74812865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildPointerType(PointeeType, Star, 7482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 7483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 74851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 748685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 748785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 74882865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Star, 7489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 7490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 74921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 74931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 749485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 749585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 749685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 74972865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 749885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 7499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 75011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 75021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 750385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 750485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 750585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 75062865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 750785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 7508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 7512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 7513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 7514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 7515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 7516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 7518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 7519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 7520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 7521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 75221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 75241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 75251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 75261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 7527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 7528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 7529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 7530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 7531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 7532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 7533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 7534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 75351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75369996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis IntegerLiteral ArraySize(SemaRef.Context, *Size, SizeType, 75379996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis /*FIXME*/BracketsRange.getBegin()); 75381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 7539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 75401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 7541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 75421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 75451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 7546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 7547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 754885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 754985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 75501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 755185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 7552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 75561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 7557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 755885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 755985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 75601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 756185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 7562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 75631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 75661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 7567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 75689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 75711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 75729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SizeExpr, 7573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 7574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 75771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 75781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 7579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 75809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 75831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 75849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SizeExpr, 7585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 7586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 7590e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson unsigned NumElements, 7591e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::VectorKind VecKind) { 7592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 7593e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 7594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 75951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 7598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 7599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 7600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 7601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 7602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 76039996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 76049996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis AttributeLoc); 76059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 7606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 76091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 76101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 76119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 76139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 7614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 76181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 7619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 76201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 7621fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman unsigned Quals, 7622c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor RefQualifierKind RefQualifier, 7623fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman const FunctionType::ExtInfo &Info) { 76241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 7625c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor Quals, RefQualifier, 7626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 7627fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman getDerived().getBaseEntity(), 7628fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman Info); 7629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 7633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 7634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 7635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 7636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 7637ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 7638ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(D && "no decl found"); 7639ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (D->isInvalidDecl()) return QualType(); 7640ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 764192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // FIXME: Doesn't account for ObjCInterfaceDecl! 7642ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeDecl *Ty; 7643ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (isa<UsingDecl>(D)) { 7644ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Using = cast<UsingDecl>(D); 7645ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(Using->isTypeName() && 7646ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-typename using"); 7647ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7648ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // A valid resolved using typename decl points to exactly one type decl. 7649ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(++Using->shadow_begin() == Using->shadow_end()); 7650ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 7651c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7652ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } else { 7653ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(isa<UnresolvedUsingTypenameDecl>(D) && 7654ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-using decl"); 7655ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<UnresolvedUsingTypenameDecl>(D); 7656ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 7657ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7658ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return SemaRef.Context.getTypeDeclType(Ty); 7659ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 7660ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7661ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> 76622a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 76632a984cad5ac3fdceeff2bd99daa7b90979313475John McCall SourceLocation Loc) { 76642a984cad5ac3fdceeff2bd99daa7b90979313475John McCall return SemaRef.BuildTypeofExprType(E, Loc); 7665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 7669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 7670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 76732a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 76742a984cad5ac3fdceeff2bd99daa7b90979313475John McCall SourceLocation Loc) { 76752a984cad5ac3fdceeff2bd99daa7b90979313475John McCall return SemaRef.BuildDecltypeType(E, Loc); 7676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 7680833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 7681833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 768267714230a191bc3c01f33378f34f34ef377991a6Douglas Gregor TemplateArgumentListInfo &TemplateArgs) { 7683d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 7684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 76851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7686dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 76871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 7688fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 7689d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 7690d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 7691fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 7692d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 7693d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 7694d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 7695d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 76961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 7697fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 7698fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor const IdentifierInfo &Name, 7699fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 770043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType, 770143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *FirstQualifierInScope) { 7702fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor UnqualifiedId TemplateName; 7703fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName.setIdentifier(&Name, NameLoc); 7704d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Sema::TemplateTy Template; 7705d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor getSema().ActOnDependentTemplateName(/*Scope=*/0, 7706fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /*FIXME:*/SourceLocation(), 7707d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor SS, 7708fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName, 7709b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType::make(ObjectType), 7710d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor /*EnteringContext=*/false, 7711d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Template); 771243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return Template.get(); 7713d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 77141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 7716ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 7717fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 7718ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 7719fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 7720ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 7721ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 7722fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // FIXME: Bogus location information. 7723fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 7724fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 7725d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Sema::TemplateTy Template; 7726d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor getSema().ActOnDependentTemplateName(/*Scope=*/0, 7727fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /*FIXME:*/SourceLocation(), 7728d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor SS, 7729d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Name, 7730b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType::make(ObjectType), 7731d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor /*EnteringContext=*/false, 7732d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Template); 7733d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor return Template.template getAsVal<TemplateName>(); 7734ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 7735c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7736ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 773760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 7739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 77409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *OrigCallee, 77419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *First, 77429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Second) { 77439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Callee = OrigCallee->IgnoreParenCasts(); 77449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 77451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 7747f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 77489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType() && 77499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall !Second->getType()->isOverloadableType()) 77509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().CreateBuiltinArraySubscriptExpr(First, 77519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Callee->getLocStart(), 77529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second, OpLoc); 77531a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 77541a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 77559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc); 77569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall } else if (Second == 0 || isPostIncDec) { 77579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType()) { 7758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 7759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 77602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall UnaryOperatorKind Opc 7761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 77621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 7764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 7765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 77669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType() && 77679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall !Second->getType()->isOverloadableType()) { 7768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 7769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 77702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 777160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 77729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 7773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 7774f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 77751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 7777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 7778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 77791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 7781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 77826e26689f5d513e24ad7783a4493201930fdeccc0John McCall UnresolvedSet<16> Functions; 77831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 7785ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 7786ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 7787ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 7788ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 77896e26689f5d513e24ad7783a4493201930fdeccc0John McCall Functions.append(ULE->decls_begin(), ULE->decls_end()); 7790ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 77919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl()); 7792ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 77931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 77959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Args[2] = { First, Second }; 77969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall unsigned NumArgs = 1 + (Second != 0); 77971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 7799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 78002de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall UnaryOperatorKind Opc 7801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 78029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 7803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 78041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7805f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 78069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(), 7807ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 78089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall First, 78099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second); 7810f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 7811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 78122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 781360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 7814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 7815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 7816f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 78171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 7819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 78201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 782126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived> 782260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 78239ae2f076ca5ab1feb3ba95629099ec2319833701John McCallTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 782426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation OperatorLoc, 782526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor bool isArrow, 7826f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor CXXScopeSpec &SS, 782726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeType, 782826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation CCLoc, 7829fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 7830a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed) { 78319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall QualType BaseType = Base->getType(); 78329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (Base->isTypeDependent() || Destroyed.getIdentifier() || 783326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor (!isArrow && !BaseType->getAs<RecordType>()) || 7834c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt (isArrow && BaseType->getAs<PointerType>() && 7835bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif !BaseType->getAs<PointerType>()->getPointeeType() 7836bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif ->template getAs<RecordType>())){ 783726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // This pseudo-destructor expression is still a pseudo-destructor. 78389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc, 783926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor isArrow? tok::arrow : tok::period, 7840fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SS, ScopeType, CCLoc, TildeLoc, 7841a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed, 784226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*FIXME?*/true); 784326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor } 78442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 7845a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 78462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 78472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 78482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 78492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.setNamedTypeInfo(DestroyedType); 78502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 785126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // FIXME: the ScopeType should be tacked onto SS. 78522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 78539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, BaseType, 785426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor OperatorLoc, isArrow, 785526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS, /*FIXME: FirstQualifier*/ 0, 78562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 785726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*TemplateArgs*/ 0); 785826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor} 785926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 7860577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 7861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7862577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 7863