TreeTransform.h revision b71d821d64af88749fc9860fd43a5164d8d819c8
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(), 70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(), 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 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, transforms all of the types and declarations within the 381dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 382dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 384a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 385c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType = QualType(), 386c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 388c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// \brief Transform the given nested-name-specifier with source-location 389c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// information. 390c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// 391c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// By default, transforms all of the types and declarations within the 392c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 393c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor /// alternate behavior. 394c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc TransformNestedNameSpecifierLoc( 395c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc NNS, 396c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType ObjectType = QualType(), 397c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 398c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 39981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 40081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 40181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 40281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 40381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 40481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 4052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo 40643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 4071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 410d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and nested-name-specifiers that occur within the template name. 412d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 4133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName TransformTemplateName(TemplateName Name, 41443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType = QualType(), 41543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *FirstQualifierInScope = 0); 4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 417fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \brief Transform the given template name. 418fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 419fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param SS The nested-name-specifier that qualifies the template 420fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// name. This nested-name-specifier must already have been transformed. 421fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 422fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param Name The template name to transform. 423fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 424fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param NameLoc The source location of the template name. 425fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 426fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param ObjectType If we're translating a template name within a member 427fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// access expression, this is the type of the object whose member template 428fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// is being referenced. 429fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 430fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// \param FirstQualifierInScope If the first part of a nested-name-specifier 431fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// also refers to a name within the current (lexical) scope, this is the 432fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// declaration it refers to. 433fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// 434fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// By default, transforms the template name by transforming the declarations 435fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// and nested-name-specifiers that occur within the template name. 436fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 437fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName TransformTemplateName(CXXScopeSpec &SS, 438fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName Name, 439fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 440fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor QualType ObjectType = QualType(), 441fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 442fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this operation transforms the type, expression, or 4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// declaration stored within the template argument and constructs a 447670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 448670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 449833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// 450833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// Returns true if there was an error. 451833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 452833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output); 453833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 454fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// \brief Transform the given set of template arguments. 455fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 456fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// By default, this operation transforms all of the template arguments 457fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// in the input set using \c TransformTemplateArgument(), and appends 458fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// the transformed arguments to the output list. 459fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 4607ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// Note that this overload of \c TransformTemplateArguments() is merely 4617ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// a convenience function. Subclasses that wish to override this behavior 4627ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// should override the iterator-based member template version. 4637ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// 464fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// \param Inputs The set of template arguments to be transformed. 465fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 466fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// \param NumInputs The number of template arguments in \p Inputs. 467fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 468fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// \param Outputs The set of transformed template arguments output by this 469fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// routine. 470fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// 471fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor /// Returns true if an error occurred. 472fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 473fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor unsigned NumInputs, 4747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentListInfo &Outputs) { 4757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs); 4767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 4777f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 4787f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// \brief Transform the given set of template arguments. 4797f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// 4807f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// By default, this operation transforms all of the template arguments 4817f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// in the input set using \c TransformTemplateArgument(), and appends 4827f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// the transformed arguments to the output list. 4837f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// 4847ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// \param First An iterator to the first template argument. 4857ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// 4867ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// \param Last An iterator one step past the last template argument. 4877f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// 4887f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// \param Outputs The set of transformed template arguments output by this 4897f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// routine. 4907f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// 4917f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor /// Returns true if an error occurred. 4927ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor template<typename InputIterator> 4937ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor bool TransformTemplateArguments(InputIterator First, 4947ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor InputIterator Last, 4957ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentListInfo &Outputs); 4967f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 497833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 498833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall void InventTemplateArgumentLoc(const TemplateArgument &Arg, 499833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &ArgLoc); 500833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 501a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall /// \brief Fakes up a TypeSourceInfo for a type. 502a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *InventTypeSourceInfo(QualType T) { 503a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return SemaRef.Context.getTrivialTypeSourceInfo(T, 504833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().getBaseLocation()); 505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 5061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 508a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 50943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 51243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType 51343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TransformTemplateSpecializationType(TypeLocBuilder &TLB, 51443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateSpecializationTypeLoc TL, 51543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateName Template); 51643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 51743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType 51843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 51943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentTemplateSpecializationTypeLoc TL, 520a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TemplateName Template); 521a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 522a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor QualType 523a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 524a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DependentTemplateSpecializationTypeLoc TL, 52543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NestedNameSpecifier *Prefix); 52643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 52794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualType 52894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 52994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor DependentTemplateSpecializationTypeLoc TL, 53094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLoc QualifierLoc); 53194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 53221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// \brief Transforms the parameters of a function type into the 53321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// given vectors. 53421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// 53521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// The result vectors should be kept in sync; null entries in the 53621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// variables vector are acceptable. 53721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// 53821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// Return true on error. 539a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor bool TransformFunctionTypeParams(SourceLocation Loc, 540a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor ParmVarDecl **Params, unsigned NumParams, 541a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor const QualType *ParamTypes, 54221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVectorImpl<QualType> &PTypes, 543a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl*> *PVars); 54421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 54521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// \brief Transforms a single function-type parameter. Return null 54621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /// on error. 5476a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 5486a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor llvm::Optional<unsigned> NumExpansions); 54921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 55043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 551833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 55260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 55360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 55660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Transform##Node(Node *S); 557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 55860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Transform##Node(Node *E); 5597381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt) 5604bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 5611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 56685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 57285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 57485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \brief Build a new reference type given the type it references. 575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 57685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// By default, performs semantic analysis when building the 57785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// reference type. Subclasses may override this routine to provide 57885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// different behavior. 579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 58085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \param LValue whether the type was written with an lvalue sigil 58185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// or an rvalue sigil. 58285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildReferenceType(QualType ReferentType, 58385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool LValue, 58485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 5851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 59185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 59285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 5931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 6071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 61685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 61785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 62685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 62785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 6369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 6479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 65682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 657e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::VectorKind VecKind); 6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 6739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 6811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 683fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman bool Variadic, unsigned Quals, 684c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor RefQualifierKind RefQualifier, 685fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman const FunctionType::ExtInfo &Info); 6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 690ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// \brief Rebuild an unresolved typename type, given the decl that 691ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /// the UnresolvedUsingTypenameDecl was transformed to. 692ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType RebuildUnresolvedUsingType(Decl *D); 693ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 694577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 697577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 699577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 7087da2431c23ef1ee8acb114e39692246e1801afc2John McCall 7091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7132a984cad5ac3fdceeff2bd99daa7b90979313475John McCall QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 718577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 719577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 722577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7242a984cad5ac3fdceeff2bd99daa7b90979313475John McCall QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72634b41d939a1328f484511c6002ba2456db879a29Richard Smith /// \brief Build a new C++0x auto type. 72734b41d939a1328f484511c6002ba2456db879a29Richard Smith /// 72834b41d939a1328f484511c6002ba2456db879a29Richard Smith /// By default, builds a new AutoType with the given deduced type. 72934b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType RebuildAutoType(QualType Deduced) { 73034b41d939a1328f484511c6002ba2456db879a29Richard Smith return SemaRef.Context.getAutoType(Deduced); 73134b41d939a1328f484511c6002ba2456db879a29Richard Smith } 73234b41d939a1328f484511c6002ba2456db879a29Richard Smith 733577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 735577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 736577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 739833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateLoc, 740d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args); 7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 742075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /// \brief Build a new parenthesized type. 743075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /// 744075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /// By default, builds a new ParenType type from the inner type. 745075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /// Subclasses may override this routine to provide different behavior. 746075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType RebuildParenType(QualType InnerType) { 747075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return SemaRef.Context.getParenType(InnerType); 748075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara } 749075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 751577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 752465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara /// By default, builds a new ElaboratedType type from the keyword, 753465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara /// the nested-name-specifier and the named type. 754465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara /// Subclasses may override this routine to provide different behavior. 75521e413fe6305a198564d436ac515497716c47844John McCall QualType RebuildElaboratedType(SourceLocation KeywordLoc, 75621e413fe6305a198564d436ac515497716c47844John McCall ElaboratedTypeKeyword Keyword, 7579e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 7589e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualType Named) { 7599e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor return SemaRef.Context.getElaboratedType(Keyword, 7609e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 7619e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor Named); 7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 763577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 766e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara /// By default, builds a new DependentNameType type from the 767e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara /// nested-name-specifier and the given type. Subclasses may override 768e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara /// this routine to provide different behavior. 76933500955d731c73717af52088b7fc0e7a85681e7John McCall QualType RebuildDependentTemplateSpecializationType( 77094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor ElaboratedTypeKeyword Keyword, 77194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 77294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor const IdentifierInfo *Name, 77394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor SourceLocation NameLoc, 77494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor const TemplateArgumentListInfo &Args) { 77594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // Rebuild the template name. 77694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // TODO: avoid TemplateName abstraction 777fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor CXXScopeSpec SS; 778fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.Adopt(QualifierLoc); 77994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TemplateName InstName 780fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 0); 78194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 78294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (InstName.isNull()) 78394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return QualType(); 78494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 78594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // If it's still dependent, make a dependent specialization. 78694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (InstName.getAsDependentTemplateName()) 78794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 78894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 78994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor Name, 79094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor Args); 79194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 79294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // Otherwise, make an elaborated type wrapping a non-dependent 79394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // specialization. 79494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualType T = 79594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 79694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (T.isNull()) return QualType(); 79794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 79894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == 0) 79994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return T; 80094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 80194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return SemaRef.Context.getElaboratedType(Keyword, 80294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 80394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor T); 80494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } 80594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 807577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 808577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 809e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara /// (or elaborated type). Subclasses may override this routine to provide 810577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 811e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 812e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara SourceLocation KeywordLoc, 8132494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 8142494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor const IdentifierInfo *Id, 815e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara SourceLocation IdLoc) { 8164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor CXXScopeSpec SS; 8172494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor SS.Adopt(QualifierLoc); 818e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara 8192494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 8204033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // If the name is still dependent, just build a new dependent name type. 8214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!SemaRef.computeDeclContext(SS)) 8222494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor return SemaRef.Context.getDependentNameType(Keyword, 8232494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 8242494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor Id); 8254033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 8264033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 827465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara if (Keyword == ETK_None || Keyword == ETK_Typename) 8282494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 829e29425bd22fbb9200bbec7b743197b9c6dad3e40Douglas Gregor *Id, IdLoc); 830465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 831465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 832465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 833e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara // We had a dependent elaborated-type-specifier that has been transformed 8344033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // into a non-dependent elaborated-type-specifier. Find the tag we're 8354033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // referring to. 836e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 8374033642464e8ba0982f88f34cffad808d247b393Douglas Gregor DeclContext *DC = SemaRef.computeDeclContext(SS, false); 8384033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!DC) 8394033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 8404033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 8415613876991c80a684595fe8de1f039296a0657ffJohn McCall if (SemaRef.RequireCompleteDeclContext(SS, DC)) 8425613876991c80a684595fe8de1f039296a0657ffJohn McCall return QualType(); 8435613876991c80a684595fe8de1f039296a0657ffJohn McCall 8444033642464e8ba0982f88f34cffad808d247b393Douglas Gregor TagDecl *Tag = 0; 8454033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SemaRef.LookupQualifiedName(Result, DC); 8464033642464e8ba0982f88f34cffad808d247b393Douglas Gregor switch (Result.getResultKind()) { 8474033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::NotFound: 8484033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::NotFoundInCurrentInstantiation: 8494033642464e8ba0982f88f34cffad808d247b393Douglas Gregor break; 850c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8514033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::Found: 8524033642464e8ba0982f88f34cffad808d247b393Douglas Gregor Tag = Result.getAsSingle<TagDecl>(); 8534033642464e8ba0982f88f34cffad808d247b393Douglas Gregor break; 854c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8554033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::FoundOverloaded: 8564033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::FoundUnresolvedValue: 8574033642464e8ba0982f88f34cffad808d247b393Douglas Gregor llvm_unreachable("Tag lookup cannot find non-tags"); 8584033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 859c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8604033642464e8ba0982f88f34cffad808d247b393Douglas Gregor case LookupResult::Ambiguous: 8614033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // Let the LookupResult structure handle ambiguities. 8624033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 8634033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 8644033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 8654033642464e8ba0982f88f34cffad808d247b393Douglas Gregor if (!Tag) { 866446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky // Check where the name exists but isn't a tag type and use that to emit 867446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky // better diagnostics. 868446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 869446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky SemaRef.LookupQualifiedName(Result, DC); 870446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky switch (Result.getResultKind()) { 871446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky case LookupResult::Found: 872446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky case LookupResult::FoundOverloaded: 873446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky case LookupResult::FoundUnresolvedValue: { 874446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 875446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky unsigned Kind = 0; 876446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky if (isa<TypedefDecl>(SomeDecl)) Kind = 1; 877446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 2; 878446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind; 879446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 880446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky break; 881446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky } 882446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky default: 883446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky // FIXME: Would be nice to highlight just the source range. 884446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 885446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky << Kind << Id << DC; 886446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky break; 887446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky } 8884033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 8894033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 890465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 891e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) { 892e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 8934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 8944033642464e8ba0982f88f34cffad808d247b393Douglas Gregor return QualType(); 8954033642464e8ba0982f88f34cffad808d247b393Douglas Gregor } 8964033642464e8ba0982f88f34cffad808d247b393Douglas Gregor 8974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor // Build the elaborated-type-specifier type. 8984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor QualType T = SemaRef.Context.getTypeDeclType(Tag); 8992494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor return SemaRef.Context.getElaboratedType(Keyword, 9002494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor QualifierLoc.getNestedNameSpecifier(), 9012494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor T); 902dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9042fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor /// \brief Build a new pack expansion type. 9052fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor /// 9062fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor /// By default, builds a new PackExpansionType type from the given pattern. 9072fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9082fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor QualType RebuildPackExpansionType(QualType Pattern, 9092fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor SourceRange PatternRange, 910cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor SourceLocation EllipsisLoc, 911cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 912cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 913cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions); 9142fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor } 9152fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 916dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 917dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 918dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 919dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 920dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 921dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 922dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 923dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 924a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 925c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 926c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 927dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 928dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 929dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 930dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 931dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 932dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 933dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 934dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 935dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 936dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 937dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 938dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 93914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor /// namespace alias named in the next step in the nested-name-specifier. 94014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor /// 94114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor /// By default, performs semantic analysis when building the new 94214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 94314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor /// different behavior. 94414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 94514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor SourceRange Range, 94614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NamespaceAliasDecl *Alias); 94714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 94814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 949dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 950dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 951dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 952dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 953dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 954dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 955dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 956dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 957edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor QualType T); 958d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 959d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 960d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 961d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 962d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 963d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 964d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 965fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName RebuildTemplateName(CXXScopeSpec &SS, 966d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 967d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 968d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 969d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 970d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 971d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 972d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 973d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 974d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 975d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 976fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName RebuildTemplateName(CXXScopeSpec &SS, 977fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor const IdentifierInfo &Name, 978fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 97943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType, 98043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *FirstQualifierInScope); 9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 982ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// \brief Build a new template name given a nested name specifier and the 983ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// overloaded operator name that is referred to as a template. 984ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// 985ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// By default, performs semantic analysis to determine whether the name can 986ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 987ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// template name. Subclasses may override this routine to provide different 988ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// behavior. 989fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName RebuildTemplateName(CXXScopeSpec &SS, 990ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 991fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 992ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType); 9931aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 9941aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// \brief Build a new template name given a template template parameter pack 9951aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// and the 9961aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// 9971aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 9981aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 9991aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// template name. Subclasses may override this routine to provide different 10001aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor /// behavior. 10011aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 10021aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor const TemplateArgument &ArgPack) { 10031aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 10041aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 10051aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 100843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 100943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 101060d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 101143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 101243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 101343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 10149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 101543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 101643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 101743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 101843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 101943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 102043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 102143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 102260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 10239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *LHS, 102443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 10259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *RHS, 102643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 10279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 102843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 102943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 103143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 103243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 103343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 103443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 103560d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 10369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall getSema().ActOnCaseStmtBody(S, Body); 10379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return S; 103843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 104043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 104143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 104243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 104343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 104460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 104543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 10469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *SubStmt) { 10479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 104843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 104943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 105143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 105243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 105343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 105443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 105557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 105657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner SourceLocation ColonLoc, Stmt *SubStmt) { 105757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 105843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 106043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 106143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 106243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 106343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 106460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 106557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner VarDecl *CondVar, Stmt *Then, 106657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner SourceLocation ElseLoc, Stmt *Else) { 106744aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else); 106843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 107043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 107143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 107243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 107343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 107460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 107557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Expr *Cond, VarDecl *CondVar) { 10769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond, 1077d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall CondVar); 107843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 108043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 108143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 108243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 108343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 108460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 108557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Stmt *Switch, Stmt *Body) { 10869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 108743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 108843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 108943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 109043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 109143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 109243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 109357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond, 109457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner VarDecl *CondVar, Stmt *Body) { 10959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body); 109643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 109843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 109943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 110043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 110143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 110260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1103ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner SourceLocation WhileLoc, SourceLocation LParenLoc, 1104ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner Expr *Cond, SourceLocation RParenLoc) { 11059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 11069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond, RParenLoc); 110743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 110843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 110943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 111043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 111143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 111243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1113ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1114ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner Stmt *Init, Sema::FullExprArg Cond, 1115ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner VarDecl *CondVar, Sema::FullExprArg Inc, 1116ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner SourceLocation RParenLoc, Stmt *Body) { 11179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1118ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner CondVar, Inc, RParenLoc, Body); 111943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 112143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 112243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 112343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 112443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1125ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1126ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner LabelDecl *Label) { 112757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 112843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 112943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 113043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 113143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 113243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 113343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 113460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1135ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner SourceLocation StarLoc, 1136ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner Expr *Target) { 11379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 113843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 114043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 114143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 114243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 114343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1144ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 11459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnReturnStmt(ReturnLoc, Result); 114643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 114843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 114943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 115043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 115143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 115260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 11531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 115443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 1155406c38e8c1f105acfd438f94dfbc17af817aa4a5Richard Smith Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls, NumDecls); 1156406c38e8c1f105acfd438f94dfbc17af817aa4a5Richard Smith return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 115743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1159703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// \brief Build a new inline asm statement. 1160703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// 1161703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// By default, performs semantic analysis to build the new statement. 1162703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson /// Subclasses may override this routine to provide different behavior. 116360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildAsmStmt(SourceLocation AsmLoc, 1164703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool IsSimple, 1165703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool IsVolatile, 1166703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson unsigned NumOutputs, 1167703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson unsigned NumInputs, 1168ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson IdentifierInfo **Names, 1169703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Constraints, 1170703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Exprs, 11719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *AsmString, 1172703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson MultiExprArg Clobbers, 1173703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson SourceLocation RParenLoc, 1174703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool MSAsm) { 1175c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1176703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson NumInputs, Names, move(Constraints), 11779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Exprs, AsmString, Clobbers, 1178703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson RParenLoc, MSAsm); 1179703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 11804dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 11814dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// \brief Build a new Objective-C @try statement. 11824dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// 11834dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// By default, performs semantic analysis to build the new statement. 11844dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 118560d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 11869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *TryBody, 11878f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor MultiStmtArg CatchStmts, 11889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *Finally) { 11899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts), 11909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Finally); 11914dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 11924dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 1193be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// \brief Rebuild an Objective-C exception declaration. 1194be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// 1195be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// By default, performs semantic analysis to build the new declaration. 1196be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 1197be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1198be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TypeSourceInfo *TInfo, QualType T) { 1199c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getSema().BuildObjCExceptionDecl(TInfo, T, 1200c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ExceptionDecl->getIdentifier(), 1201be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor ExceptionDecl->getLocation()); 1202be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 1203c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1204be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// \brief Build a new Objective-C @catch statement. 1205be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// 1206be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// By default, performs semantic analysis to build the new statement. 1207be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 120860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1209be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor SourceLocation RParenLoc, 1210be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *Var, 12119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *Body) { 1212be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 12139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Var, Body); 1214be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 1215c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 12164dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// \brief Build a new Objective-C @finally statement. 12174dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// 12184dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// By default, performs semantic analysis to build the new statement. 12194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 122060d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 12219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *Body) { 12229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 12234dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 1224c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 12258fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// \brief Build a new Objective-C @throw statement. 1226d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// 1227d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// By default, performs semantic analysis to build the new statement. 1228d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor /// Subclasses may override this routine to provide different behavior. 122960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 12309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Operand) { 12319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1232d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor } 1233c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 12348fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// \brief Build a new Objective-C @synchronized statement. 12358fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// 12368fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// By default, performs semantic analysis to build the new statement. 12378fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor /// Subclasses may override this routine to provide different behavior. 123860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 12399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Object, 12409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *Body) { 12419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, 12429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body); 12438fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor } 1244c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor 1245c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// \brief Build a new Objective-C fast enumeration statement. 1246c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// 1247c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// By default, performs semantic analysis to build the new statement. 1248c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /// Subclasses may override this routine to provide different behavior. 124960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1250f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation LParenLoc, 1251f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Stmt *Element, 1252f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Expr *Collection, 1253f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation RParenLoc, 1254f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Stmt *Body) { 1255c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc, 12569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Element, 12579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Collection, 1258c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor RParenLoc, 12599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body); 1260c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor } 1261c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 126243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 126343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 126443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 126543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 126683cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1267a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *Declarator, 126843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 126983cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor SourceLocation Loc) { 127083cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor return getSema().BuildExceptionDeclaration(0, Declarator, Name, Loc); 127143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 127243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 127343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 127443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 127543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 127643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 127760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 1278f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall VarDecl *ExceptionDecl, 1279f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Stmt *Handler) { 12809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 12819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Handler)); 128243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 128443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 128543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 128643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 128743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 128860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 1289f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Stmt *TryBlock, 1290f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiStmtArg Handlers) { 12919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers)); 129243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 12931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 129860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 1299f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall LookupResult &R, 1300f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall bool RequiresADL) { 1301f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 1302f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 1303f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1304f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1305f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// \brief Build a new expression that references a declaration. 1306f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// 1307f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// By default, performs semantic analysis to build the new expression. 1308f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Subclasses may override this routine to provide different behavior. 130940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 1310f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall ValueDecl *VD, 1311f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall const DeclarationNameInfo &NameInfo, 1312f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall TemplateArgumentListInfo *TemplateArgs) { 1313a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 131440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor SS.Adopt(QualifierLoc); 1315dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 1316dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: loses template args. 13172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 13182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 132560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 13279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1330a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 13311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1332a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1333a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 133460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 1335f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SourceLocation OperatorLoc, 1336f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor bool isArrow, 1337f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor CXXScopeSpec &SS, 1338f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor TypeSourceInfo *ScopeType, 1339f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SourceLocation CCLoc, 1340f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SourceLocation TildeLoc, 1341a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed); 13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 134760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 13482de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall UnaryOperatorKind Opc, 13499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr) { 13509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr); 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Build a new builtin offsetof expression. 13548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// 13558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// By default, performs semantic analysis to build the new expression. 13568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// Subclasses may override this routine to provide different behavior. 135760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 13588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *Type, 1359f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::OffsetOfComponent *Components, 13608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned NumComponents, 13618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RParenLoc) { 13628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 13638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor NumComponents, RParenLoc); 13648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1365c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 13671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 137060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo, 13715ab75172051a6d2ea71a80a79e81c65519fd3462John McCall SourceLocation OpLoc, 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 1373a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R); 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 13761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 13781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 138160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildSizeOfAlignOf(Expr *SubExpr, SourceLocation OpLoc, 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 138360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 13849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall = getSema().CreateSizeOfAlignOfExpr(SubExpr, OpLoc, isSizeOf, R); 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1386f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 13871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 13921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 139560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildArraySubscriptExpr(Expr *LHS, 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 13979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *RHS, 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 13999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS, 14009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LBracketLoc, RHS, 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 14051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 140860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1410e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne SourceLocation RParenLoc, 1411e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne Expr *ExecConfig = 0) { 14129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc, 1413e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne move(Args), RParenLoc, ExecConfig); 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 14171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 142060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 1421f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall bool isArrow, 142240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 1423f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall const DeclarationNameInfo &MemberNameInfo, 1424f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ValueDecl *Member, 1425f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall NamedDecl *FoundDecl, 1426d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *ExplicitTemplateArgs, 1427f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall NamedDecl *FirstQualifierInScope) { 1428d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 1429f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall // We have a reference to an unnamed field. This is always the 1430f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall // base of an anonymous struct/union member access, i.e. the 1431f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall // field is always of record type. 143240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!"); 1433f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall assert(Member->getType()->isRecordType() && 1434f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall "unnamed member not of record type?"); 14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 143640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (getSema().PerformObjectMemberConversion(Base, 143740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc.getNestedNameSpecifier(), 14386bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl, Member)) 1439f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 14408aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor 1441f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); 14421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 14439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall new (getSema().Context) MemberExpr(Base, isArrow, 14442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Member, MemberNameInfo, 1445f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall cast<FieldDecl>(Member)->getType(), 1446f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall VK, OK_Ordinary); 1447d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 1448d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 14491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 145083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 145140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor SS.Adopt(QualifierLoc); 145283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 14539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall getSema().DefaultFunctionArrayConversion(Base); 14549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall QualType BaseType = Base->getType(); 1455aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 14566bb8017bb9e828d118e15e59d71c66bba323c364John McCall // FIXME: this involves duplicating earlier analysis in a lot of 14576bb8017bb9e828d118e15e59d71c66bba323c364John McCall // cases; we should avoid this when possible. 14582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 14596bb8017bb9e828d118e15e59d71c66bba323c364John McCall R.addDecl(FoundDecl); 1460c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R.resolveKind(); 1461c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 14629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 1463129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 1464c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, ExplicitTemplateArgs); 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 14681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 147160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 14722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall BinaryOperatorKind Opc, 14739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *LHS, Expr *RHS) { 14749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS); 1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 14781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 148160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildConditionalOperator(Expr *Cond, 148256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation QuestionLoc, 148356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *LHS, 148456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation ColonLoc, 148556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *RHS) { 14869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 14879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS, RHS); 1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 14911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 149460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 14959d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 14979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr) { 1498b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 14999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr); 1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 15031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 150660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 150742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *TInfo, 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 15099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Init) { 151042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 15119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init); 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access 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 RebuildExtVectorElementExpr(Expr *Base, 1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 1522aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 1523129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall CXXScopeSpec SS; 15242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 15259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 1526129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OpLoc, /*IsArrow*/ false, 1527129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, /*FirstQualifierInScope*/ 0, 15282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 1529129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /* TemplateArgs */ 0); 1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 15331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 153660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildInitList(SourceLocation LBraceLoc, 1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1538e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor SourceLocation RBraceLoc, 1539e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor QualType ResultTy) { 154060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 1541e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1542e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor if (Result.isInvalid() || ResultTy->isDependentType()) 1543e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1544c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1545e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // Patch in the result type we were given, which may have been computed 1546e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // when the initial InitListExpr was built. 1547e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1548e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor ILE->setType(ResultTy); 1549e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 15531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 155660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildDesignatedInitExpr(Designation &Desig, 1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 15609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Init) { 156160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 15639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init); 1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1565f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 157660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildImplicitValueInitExpr(QualType T) { 1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 158460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 15859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, TypeSourceInfo *TInfo, 15862cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara SourceLocation RParenLoc) { 15872cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara return getSema().BuildVAArgExpr(BuiltinLoc, 15889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, TInfo, 15892cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara RParenLoc); 1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 15931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 159660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1599c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc, 1600f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian move(SubExprs)); 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 16041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 160860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1609ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner SourceLocation LabelLoc, LabelDecl *Label) { 161057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 16141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 161760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 16189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Stmt *SubStmt, 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 16209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 162760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 16289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Cond, Expr *LHS, Expr *RHS, 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 16319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond, LHS, RHS, 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 164360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 16459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Callee, 16469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *First, 16479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Second); 16481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 165560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 16589d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 16619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 16659d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 16661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 16679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, RParenLoc); 1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 16709d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 16729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, RParenLoc); 16731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 16759d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 16761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 16779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, 1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 16819d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 16839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr, RParenLoc); 16841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1690f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 169760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 16999d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 17029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1704c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 17059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall TInfo, SubExpr, 1706c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1707c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 171460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 17169d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 17199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1721c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 17229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall TInfo, SubExpr, 1723c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1724c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 173160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 17339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 17369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1738c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 17399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall TInfo, SubExpr, 1740c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1741c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 174860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 17509d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo, 1751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 17539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SubExpr, 1754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1755c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 17569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall TInfo, SubExpr, 1757c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LAngleLoc, RAngleLoc), 1758c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall SourceRange(LParenLoc, RParenLoc)); 1759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1765ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 1766ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation LParenLoc, 1767ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor Expr *Sub, 1768ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation RParenLoc) { 1769ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 1770f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall MultiExprArg(&Sub, 1), 1771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 17731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 177860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 177957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor SourceLocation TypeidLoc, 178057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *Operand, 1781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1782c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 178357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor RParenLoc); 1784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 17851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 178601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 1787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 179160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 179257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor SourceLocation TypeidLoc, 17939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Operand, 1794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 17959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 179657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor RParenLoc); 17971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 179901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// \brief Build a new C++ __uuidof(type) expression. 180001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// 180101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// By default, performs semantic analysis to build the new expression. 180201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// Subclasses may override this routine to provide different behavior. 180301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 180401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceLocation TypeidLoc, 180501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TypeSourceInfo *Operand, 180601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceLocation RParenLoc) { 180701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 180801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet RParenLoc); 180901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 181001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 181101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// \brief Build a new C++ __uuidof(expr) expression. 181201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// 181301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// By default, performs semantic analysis to build the new expression. 181401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// Subclasses may override this routine to provide different behavior. 181501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 181601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceLocation TypeidLoc, 181701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Expr *Operand, 181801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceLocation RParenLoc) { 181901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 182001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet RParenLoc); 182101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 182201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 1823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 182860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1829ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor QualType ThisType, 1830ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor bool isImplicit) { 1831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1832828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, 1833828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor isImplicit)); 1834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 184060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub) { 18419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnCXXThrow(ThrowLoc, Sub); 1842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 184960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 1850036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param) { 1851036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc, 1852036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor Param)); 1853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1859ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 1860ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation LParenLoc, 1861ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation RParenLoc) { 1862ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, 18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1864ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor RParenLoc); 1865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 18661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 187160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 18721bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor bool UseGlobal, 18731bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceLocation PlacementLParen, 18741bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor MultiExprArg PlacementArgs, 18751bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceLocation PlacementRParen, 18761bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceRange TypeIdParens, 18771bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor QualType AllocatedType, 18781bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *AllocatedTypeInfo, 18791bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor Expr *ArraySize, 18801bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceLocation ConstructorLParen, 18811bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor MultiExprArg ConstructorArgs, 18821bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor SourceLocation ConstructorRParen) { 18831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 18874bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor TypeIdParens, 18881bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocatedType, 18891bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocatedTypeInfo, 18909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall ArraySize, 1891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 18951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 190060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 19039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Operand) { 1904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 19059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Operand); 1906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 19071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 191260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 19133d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor SourceLocation StartLoc, 19143d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor TypeSourceInfo *T, 19153d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor SourceLocation RParenLoc) { 19163d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor return getSema().BuildUnaryTypeTrait(Trait, StartLoc, T, RParenLoc); 1917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 19196ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet /// \brief Build a new binary type trait expression. 19206ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet /// 19216ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet /// By default, performs semantic analysis to build the new expression. 19226ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet /// Subclasses may override this routine to provide different behavior. 19236ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet ExprResult RebuildBinaryTypeTrait(BinaryTypeTrait Trait, 19246ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet SourceLocation StartLoc, 19256ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *LhsT, 19266ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *RhsT, 19276ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet SourceLocation RParenLoc) { 19286ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc); 19296ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet } 19306ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 19311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 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. 193600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor ExprResult RebuildDependentScopeDeclRefExpr( 193700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 19382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 1939f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall const TemplateArgumentListInfo *TemplateArgs) { 1940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 194100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor SS.Adopt(QualifierLoc); 1942f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 1943f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (TemplateArgs) 19442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo, 1945f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall *TemplateArgs); 1946f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 19472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo); 1948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 195460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 1955f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult &R, 1956f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool RequiresADL, 1957d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 1958f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs); 1959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 196560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXConstructExpr(QualType T, 19664411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor SourceLocation Loc, 1967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 19698c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor MultiExprArg Args, 19708c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor bool RequiresZeroInit, 1971428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth CXXConstructExpr::ConstructionKind ConstructKind, 1972428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth SourceRange ParenRange) { 1973ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConvertedArgs(SemaRef); 1974c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, 19754411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor ConvertedArgs)) 1976f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 1977c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 19784411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 19798c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor move_arg(ConvertedArgs), 1980428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth RequiresZeroInit, ConstructKind, 1981428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth ParenRange); 1982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1988ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 1989ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation LParenLoc, 1990ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor MultiExprArg Args, 1991ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation RParenLoc) { 1992ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getSema().BuildCXXTypeConstructExpr(TSInfo, 1993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 2000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 2001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 2002ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2003ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation LParenLoc, 2004ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor MultiExprArg Args, 2005ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation RParenLoc) { 2006ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getSema().BuildCXXTypeConstructExpr(TSInfo, 2007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 2008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 2009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 2010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 20111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 2013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 2014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 2015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 201660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 20177c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualType BaseType, 20187c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor bool IsArrow, 20197c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor SourceLocation OperatorLoc, 20207c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2021129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall NamedDecl *FirstQualifierInScope, 20222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &MemberNameInfo, 2023129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 2024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 20257c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor SS.Adopt(QualifierLoc); 20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2028aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 2029129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SS, FirstQualifierInScope, 20302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberNameInfo, 20312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TemplateArgs); 2032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2034129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Build a new member reference expression. 20353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 20363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 20373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 203860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, 2039aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType, 2040129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 2041129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool IsArrow, 20424c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2043c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope, 2044129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall LookupResult &R, 2045129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall const TemplateArgumentListInfo *TemplateArgs) { 20463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 20474c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor SS.Adopt(QualifierLoc); 20481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2050aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OperatorLoc, IsArrow, 2051c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall SS, FirstQualifierInScope, 2052c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall R, TemplateArgs); 20533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20552e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl /// \brief Build a new noexcept expression. 20562e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl /// 20572e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl /// By default, performs semantic analysis to build the new expression. 20582e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl /// Subclasses may override this routine to provide different behavior. 20592e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 20602e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 20612e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl } 20622e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 2063ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Build a new expression to compute the length of a parameter pack. 2064ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 2065ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation PackLoc, 2066ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation RParenLoc, 2067ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor unsigned Length) { 2068ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 2069ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor OperatorLoc, Pack, PackLoc, 2070ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor RParenLoc, Length); 2071ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor } 2072ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 2073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 2074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 2075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 2076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 207760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 207881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodeTypeInfo, 2079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 208081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, 2081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 20821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 2083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 208492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /// \brief Build a new Objective-C class message. 208560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 208692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Selector Sel, 2087f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelectorLoc, 208892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ObjCMethodDecl *Method, 2089c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt SourceLocation LBracLoc, 209092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor MultiExprArg Args, 209192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor SourceLocation RBracLoc) { 209292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return SemaRef.BuildClassMessage(ReceiverTypeInfo, 209392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverTypeInfo->getType(), 209492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /*SuperLoc=*/SourceLocation(), 2095f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis Sel, Method, LBracLoc, SelectorLoc, 2096f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis RBracLoc, move(Args)); 209792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 209892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 209992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /// \brief Build a new Objective-C instance message. 210060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCMessageExpr(Expr *Receiver, 210192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Selector Sel, 2102f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelectorLoc, 210392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ObjCMethodDecl *Method, 2104c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt SourceLocation LBracLoc, 210592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor MultiExprArg Args, 210692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor SourceLocation RBracLoc) { 21079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildInstanceMessage(Receiver, 21089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Receiver->getType(), 210992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /*SuperLoc=*/SourceLocation(), 2110f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis Sel, Method, LBracLoc, SelectorLoc, 2111f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis RBracLoc, move(Args)); 211292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 211392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 2114f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// \brief Build a new Objective-C ivar reference expression. 2115f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// 2116f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// By default, performs semantic analysis to build the new expression. 2117f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// Subclasses may override this routine to provide different behavior. 211860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 2119f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor SourceLocation IvarLoc, 2120f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor bool IsArrow, bool IsFreeIvar) { 2121f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // FIXME: We lose track of the IsFreeIvar bit. 2122f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor CXXScopeSpec SS; 21239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Base = BaseArg; 2124f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc, 2125f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Sema::LookupMemberName); 212660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2127f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FIME:*/IvarLoc, 2128d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SS, 0, 2129ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall false); 2130f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.isInvalid()) 2131f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 2132c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2133f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.get()) 2134f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return move(Result); 2135c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 21369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2137c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /*FIXME:*/IvarLoc, IsArrow, SS, 2138f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FirstQualifierInScope=*/0, 2139c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt R, 2140f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*TemplateArgs=*/0); 2141f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor } 2142e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor 2143e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// \brief Build a new Objective-C property reference expression. 2144e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// 2145e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// By default, performs semantic analysis to build the new expression. 2146e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /// Subclasses may override this routine to provide different behavior. 214760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 2148e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor ObjCPropertyDecl *Property, 2149e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor SourceLocation PropertyLoc) { 2150e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor CXXScopeSpec SS; 21519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Base = BaseArg; 2152e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor LookupResult R(getSema(), Property->getDeclName(), PropertyLoc, 2153e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Sema::LookupMemberName); 2154e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor bool IsArrow = false; 215560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2156e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*FIME:*/PropertyLoc, 2157d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SS, 0, false); 2158e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Result.isInvalid()) 2159f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 2160c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2161e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Result.get()) 2162e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor return move(Result); 2163c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 21649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2165c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /*FIXME:*/PropertyLoc, IsArrow, 2166c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt SS, 2167e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*FirstQualifierInScope=*/0, 2168c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt R, 2169e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor /*TemplateArgs=*/0); 2170e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor } 2171c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 217212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall /// \brief Build a new Objective-C property reference expression. 21739cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// 21749cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor /// By default, performs semantic analysis to build the new expression. 217512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall /// Subclasses may override this routine to provide different behavior. 217612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 217712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall ObjCMethodDecl *Getter, 217812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall ObjCMethodDecl *Setter, 217912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall SourceLocation PropertyLoc) { 218012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // Since these expressions can only be value-dependent, we do not 218112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // need to perform semantic analysis again. 218212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return Owned( 218312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 218412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall VK_LValue, OK_ObjCProperty, 218512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall PropertyLoc, Base)); 21869cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor } 21879cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor 2188f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// \brief Build a new Objective-C "isa" expression. 2189f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// 2190f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// By default, performs semantic analysis to build the new expression. 2191f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /// Subclasses may override this routine to provide different behavior. 219260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 2193f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor bool IsArrow) { 2194f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor CXXScopeSpec SS; 21959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Base = BaseArg; 2196f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc, 2197f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Sema::LookupMemberName); 219860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2199f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FIME:*/IsaLoc, 2200d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SS, 0, false); 2201f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.isInvalid()) 2202f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 2203c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2204f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Result.get()) 2205f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor return move(Result); 2206c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 22079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2208c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /*FIXME:*/IsaLoc, IsArrow, SS, 2209f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*FirstQualifierInScope=*/0, 2210c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt R, 2211f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor /*TemplateArgs=*/0); 2212f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor } 2213c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 2215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 2216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 2217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 221860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 2219f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall MultiExprArg SubExprs, 2220f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall SourceLocation RParenLoc) { 2221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 22221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 2223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 2224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 2225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 2226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 22271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 2229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 2231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 2232f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall VK_LValue, BuiltinLoc); 2233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 22341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 2236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 2237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 2238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 2239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 22405291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor Builtin->getCallResultType(), 2241f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr::getValueKindForType(Builtin->getResultType()), 2242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 224360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult OwnedCall(SemaRef.Owned(TheCall)); 22441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 224660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 2247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 2248f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 22491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 22511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 2252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 225343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 22548491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// \brief Build a new template argument pack expansion. 22558491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// 22568491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// By default, performs semantic analysis to build a new pack expansion 22578491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// for a template argument. Subclasses may override this routine to provide 22588491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor /// different behavior. 22598491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 2260cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor SourceLocation EllipsisLoc, 2261cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 22628491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor switch (Pattern.getArgument().getKind()) { 22637a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor case TemplateArgument::Expression: { 22647a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor ExprResult Result 226567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 226667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor EllipsisLoc, NumExpansions); 22677a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor if (Result.isInvalid()) 22687a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor return TemplateArgumentLoc(); 22697a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor 22707a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor return TemplateArgumentLoc(Result.get(), Result.get()); 22717a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor } 2272dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 22738491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Template: 2274a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return TemplateArgumentLoc(TemplateArgument( 2275a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Pattern.getArgument().getAsTemplate(), 22762be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor NumExpansions), 2277b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Pattern.getTemplateQualifierLoc(), 2278a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Pattern.getTemplateNameLoc(), 2279a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor EllipsisLoc); 22808491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 22818491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Null: 22828491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Integral: 22838491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Declaration: 22848491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Pack: 2285a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 22868491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor llvm_unreachable("Pack expansion pattern has no parameter packs"); 22878491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 22888491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Type: 22898491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (TypeSourceInfo *Expansion 22908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 2291cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor EllipsisLoc, 2292cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions)) 22938491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 22948491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Expansion); 22958491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor break; 22968491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 22978491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 22988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return TemplateArgumentLoc(); 22998491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 23008491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 2301dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// \brief Build a new expression pack expansion. 2302dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// 2303dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// By default, performs semantic analysis to build a new pack expansion 2304dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// for an expression. Subclasses may override this routine to provide 2305dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor /// different behavior. 230667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 230767fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor llvm::Optional<unsigned> NumExpansions) { 230867fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 2309dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor } 2310dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 231143fed0de4f5bc189e45562491f83d5193eb8dac0John McCallprivate: 2312c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TypeLoc TransformTypeInObjectScope(TypeLoc TL, 2313c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType ObjectType, 2314c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamedDecl *FirstQualifierInScope, 2315c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor CXXScopeSpec &SS); 2316b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 2317b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 2318b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor QualType ObjectType, 2319b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor NamedDecl *FirstQualifierInScope, 2320b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor CXXScopeSpec &SS); 2321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 2322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 232343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 232460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 232543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 232643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 23271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 232843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 232943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 23301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 233143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 233243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 233343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 233463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node) 233543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 23364bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 23371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 233843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 233943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 23407381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt) 234143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 23424bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 234343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 234460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 234543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 2346f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 23471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take())); 234943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 23501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 23511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23523fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 235343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 23541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2356670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 235760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 2358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 2359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 2360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 2362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 2363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 23647381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt) 2365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 2366454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 23674bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 23681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 23691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23703fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 2371657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 2372657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 2373657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 2374aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorbool TreeTransform<Derived>::TransformExprs(Expr **Inputs, 2375aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor unsigned NumInputs, 2376aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor bool IsCall, 2377aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor llvm::SmallVectorImpl<Expr *> &Outputs, 2378aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor bool *ArgChanged) { 2379aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor for (unsigned I = 0; I != NumInputs; ++I) { 2380aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor // If requested, drop call arguments that need to be dropped. 2381aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 2382aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (ArgChanged) 2383aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor *ArgChanged = true; 2384aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2385aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor break; 2386aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor } 2387aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2388dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 2389dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Expr *Pattern = Expansion->getPattern(); 2390dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2391dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; 2392dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 2393dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 2394dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2395dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // Determine whether the set of unexpanded parameter packs can and should 2396dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // be expanded. 2397dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor bool Expand = true; 2398d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 239967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor llvm::Optional<unsigned> OrigNumExpansions 240067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor = Expansion->getNumExpansions(); 240167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 2402dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 2403dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Pattern->getSourceRange(), 2404dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Unexpanded.data(), 2405dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Unexpanded.size(), 2406d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor Expand, RetainExpansion, 2407d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 2408dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor return true; 2409dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2410dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (!Expand) { 2411dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // The transform has determined that we should perform a simple 2412dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // transformation on the pack expansion, producing another pack 2413dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // expansion. 2414dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 2415dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor ExprResult OutPattern = getDerived().TransformExpr(Pattern); 2416dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (OutPattern.isInvalid()) 2417dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor return true; 2418dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2419dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 242067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor Expansion->getEllipsisLoc(), 242167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor NumExpansions); 2422dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (Out.isInvalid()) 2423dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor return true; 2424dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2425dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (ArgChanged) 2426dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor *ArgChanged = true; 2427dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Outputs.push_back(Out.get()); 2428dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor continue; 2429dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor } 2430dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2431dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // The transform has determined that we should perform an elementwise 2432dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor // expansion of the pattern. Do so. 2433cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 2434dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 2435dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor ExprResult Out = getDerived().TransformExpr(Pattern); 2436dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (Out.isInvalid()) 2437dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor return true; 2438dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 243977d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor if (Out.get()->containsUnexpandedParameterPack()) { 244067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(), 244167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor OrigNumExpansions); 244277d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor if (Out.isInvalid()) 244377d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor return true; 244477d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor } 244577d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor 2446dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor if (ArgChanged) 2447dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor *ArgChanged = true; 2448dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor Outputs.push_back(Out.get()); 2449dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor } 2450dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2451dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor continue; 2452dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor } 2453dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor 2454aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor ExprResult Result = getDerived().TransformExpr(Inputs[I]); 2455aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (Result.isInvalid()) 2456aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return true; 2457aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2458aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (Result.get() != Inputs[I] && ArgChanged) 2459aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor *ArgChanged = true; 2460aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2461aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Outputs.push_back(Result.get()); 2462aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor } 2463aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2464aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return false; 2465aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor} 2466aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2467aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregortemplate<typename Derived> 2468dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 2469dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 2470a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 2471c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 2472c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 247343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NestedNameSpecifier *Prefix = NNS->getPrefix(); 24741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 247543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 2476dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 24771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 2478c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 2479c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 2480dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 2481dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 2482dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 24831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2484dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 2485dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 248643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (Prefix) { 248743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // The object type and qualifier-in-scope really apply to the 248843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // leftmost entity. 248943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjectType = QualType(); 249043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FirstQualifierInScope = 0; 249143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } 249243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 24931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 2494a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 2495a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 2496a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 2497dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 24981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 2500a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 2501c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 2502c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 25031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2504dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 2506dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 25077c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Range.getBegin(), 25087c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NNS->getAsNamespace())); 25091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 2510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 2511dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 2512dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 25131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 2515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 25161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 251714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor case NestedNameSpecifier::NamespaceAlias: { 251814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NamespaceAliasDecl *Alias 251914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor = cast_or_null<NamespaceAliasDecl>( 252014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor getDerived().TransformDecl(Range.getBegin(), 252114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NNS->getAsNamespaceAlias())); 252214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor if (!getDerived().AlwaysRebuild() && 252314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor Prefix == NNS->getPrefix() && 252414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor Alias == NNS->getAsNamespaceAlias()) 252514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NNS; 252614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 252714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, Alias); 252814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor } 252914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 2530dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 2531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 2532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 2533dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 25341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2535dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 2536dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 2537fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 2538b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor CXXScopeSpec SS; 2539b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SS.MakeTrivial(SemaRef.Context, Prefix, Range); 2540b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 2541b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TypeSourceInfo *TSInfo 2542b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = SemaRef.Context.getTrivialTypeSourceInfo(QualType(NNS->getAsType(), 0), 2543b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Range.getEnd()); 2544b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TSInfo = TransformTypeInObjectScope(TSInfo, 2545b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor ObjectType, 2546b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor FirstQualifierInScope, 2547b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SS); 2548b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor if (!TSInfo) 2549d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 25501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2551b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor QualType T = TSInfo->getType(); 2552dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 2553dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 2554dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 2555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 25561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 25581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 2559edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor T); 2560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 2561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 25621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 25641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 2565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 2566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 2567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 2568c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc 2569c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorTreeTransform<Derived>::TransformNestedNameSpecifierLoc( 2570c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc NNS, 2571c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType ObjectType, 2572c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamedDecl *FirstQualifierInScope) { 2573c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor llvm::SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 2574c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 2575c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Qualifier = Qualifier.getPrefix()) 2576c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Qualifiers.push_back(Qualifier); 2577c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2578c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor CXXScopeSpec SS; 2579c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor while (!Qualifiers.empty()) { 2580c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 2581c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 2582c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2583c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor switch (QNNS->getKind()) { 2584c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::Identifier: 2585c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0, 2586c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor *QNNS->getAsIdentifier(), 2587c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalBeginLoc(), 2588c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalEndLoc(), 2589c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ObjectType, false, SS, 2590c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor FirstQualifierInScope, false)) 2591c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 2592c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2593c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2594c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2595c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::Namespace: { 2596c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamespaceDecl *NS 2597c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = cast_or_null<NamespaceDecl>( 2598c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor getDerived().TransformDecl( 2599c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalBeginLoc(), 2600c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QNNS->getAsNamespace())); 2601c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 2602c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2603c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 2604c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2605c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::NamespaceAlias: { 2606c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamespaceAliasDecl *Alias 2607c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = cast_or_null<NamespaceAliasDecl>( 2608c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor getDerived().TransformDecl(Q.getLocalBeginLoc(), 2609c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QNNS->getAsNamespaceAlias())); 2610c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 2611c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalEndLoc()); 2612c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2613c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 2614c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2615c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::Global: 2616c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // There is no meaningful transformation that one could perform on the 2617c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // global scope. 2618c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 2619c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2620c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2621c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 2622c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor case NestedNameSpecifier::TypeSpec: { 2623c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 2624c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor FirstQualifierInScope, SS); 2625c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2626c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!TL) 2627c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 2628c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2629c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 2630c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && 2631c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TL.getType()->isEnumeralType())) { 2632c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor assert(!TL.getType().hasLocalQualifiers() && 2633c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor "Can't get cv-qualifiers here"); 2634c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 2635c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Q.getLocalEndLoc()); 2636c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor break; 2637c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 2638c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2639c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 2640c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor << TL.getType() << SS.getRange(); 2641c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(); 2642c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 26437c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor } 2644c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 26457c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor // The qualifier-in-scope and object type only apply to the leftmost entity. 2646c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor FirstQualifierInScope = 0; 26477c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor ObjectType = QualType(); 2648c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 2649c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2650c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // Don't rebuild the nested-name-specifier if we don't have to. 2651c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 2652c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor !getDerived().AlwaysRebuild()) 2653c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NNS; 2654c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2655c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // If we can re-use the source-location data from the original 2656c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // nested-name-specifier, do so. 2657c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (SS.location_size() == NNS.getDataLength() && 2658c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 2659c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 2660c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2661c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // Allocate new nested-name-specifier location information. 2662c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return SS.getWithLocInContext(SemaRef.Context); 2663c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor} 2664c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 2665c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename Derived> 26662577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameInfo 26672577743c5650c646fb705df01403707e94f2df04Abramo BagnaraTreeTransform<Derived> 266843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 26692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName Name = NameInfo.getName(); 267081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 26712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(); 267281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 267381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 267481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 267581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 267681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 267781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 267881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 26793e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 268081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 26812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return NameInfo; 26821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 268381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 268481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 268581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 26862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TypeSourceInfo *NewTInfo; 26872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara CanQualType NewCanTy; 26882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 268943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NewTInfo = getDerived().TransformType(OldTInfo); 269043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (!NewTInfo) 269143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return DeclarationNameInfo(); 269243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 26932577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 26942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara else { 26952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewTInfo = 0; 26962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 269743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 26982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (NewT.isNull()) 26992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(); 27002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewCanTy = SemaRef.Context.getCanonicalType(NewT); 27012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName NewName 27042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 27052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewCanTy); 27062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NewNameInfo(NameInfo); 27072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewNameInfo.setName(NewName); 27082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NewNameInfo.setNamedTypeInfo(NewTInfo); 27092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return NewNameInfo; 271081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 27111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara assert(0 && "Unknown name kind."); 27142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(); 271581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 271681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 271781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 27181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 27193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 272043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType, 272143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *FirstQualifierInScope) { 2722fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // FIXME: This routine needs to go away. 27237c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor SourceLocation Loc = getDerived().getBaseLocation(); 27247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor 2725d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 27261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 2727d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 272843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall /*FIXME*/ SourceRange(Loc), 272943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjectType, 273043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FirstQualifierInScope); 2731d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 2732d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2734d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 27351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 27367c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template)); 2737d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 2738d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 27391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2740d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2741d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 2742d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 2743d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 27441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2745fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor CXXScopeSpec SS; 2746fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.MakeTrivial(SemaRef.Context, NNS, Loc); 2747fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 2748d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 2749d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 27501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2751f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they make it into the AST. 275243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall llvm_unreachable("overloaded template name survived to here"); 2753d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 27541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2755d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 275643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NestedNameSpecifier *NNS = DTN->getQualifier(); 275743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (NNS) { 275843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NNS = getDerived().TransformNestedNameSpecifier(NNS, 275943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall /*FIXME:*/SourceRange(Loc), 276043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjectType, 276143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FirstQualifierInScope); 276243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (!NNS) return TemplateName(); 276343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 276443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // These apply to the scope specifier, not the template. 276543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjectType = QualType(); 276643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FirstQualifierInScope = 0; 276743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } 27681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2769d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2770dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 2771dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 2772d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 27731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2774fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // FIXME: Bad source-location information all around. 2775fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor CXXScopeSpec SS; 2776fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.MakeTrivial(SemaRef.Context, NNS, getDerived().getBaseLocation()); 27771efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor if (DTN->isIdentifier()) { 2778fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, 2779fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor *DTN->getIdentifier(), 2780fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor getDerived().getBaseLocation(), 278143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjectType, 278243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FirstQualifierInScope); 27831efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor } 2784c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2785fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, DTN->getOperator(), 2786fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor getDerived().getBaseLocation(), 2787ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 2788d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 27891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2790d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 27911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 27927c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template)); 2793d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 2794d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 27951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2796d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2797d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 2798d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 27991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2800d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 2801d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 28021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28031aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (SubstTemplateTemplateParmPackStorage *SubstPack 28041aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = Name.getAsSubstTemplateTemplateParmPack()) { 28051aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TemplateTemplateParmDecl *TransParam 28061aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = cast_or_null<TemplateTemplateParmDecl>( 28071aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor getDerived().TransformDecl(Loc, SubstPack->getParameterPack())); 28081aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!TransParam) 28091aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return TemplateName(); 28101aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 28111aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor if (!getDerived().AlwaysRebuild() && 28121aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor TransParam == SubstPack->getParameterPack()) 28131aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return Name; 28141aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 28151aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor return getDerived().RebuildTemplateName(TransParam, 28161aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstPack->getArgumentPack()); 28171aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 28181aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 2819f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // These should be getting filtered out before they reach the AST. 282043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall llvm_unreachable("overloaded function decl survived to here"); 2821f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return TemplateName(); 2822d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 2823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 2824d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 2825fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTemplateName 2826fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 2827fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName Name, 2828fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 2829fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor QualType ObjectType, 2830fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor NamedDecl *FirstQualifierInScope) { 2831fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 2832fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateDecl *Template = QTN->getTemplateDecl(); 2833fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor assert(Template && "qualified template name must refer to a template"); 2834fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2835fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateDecl *TransTemplate 2836fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 2837fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor Template)); 2838fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!TransTemplate) 2839fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(); 2840fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2841fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!getDerived().AlwaysRebuild() && 2842fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.getScopeRep() == QTN->getQualifier() && 2843fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TransTemplate == Template) 2844fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return Name; 2845fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2846fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 2847fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TransTemplate); 2848fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2849fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2850fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 2851fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (SS.getScopeRep()) { 2852fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // These apply to the scope specifier, not the template. 2853fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor ObjectType = QualType(); 2854fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor FirstQualifierInScope = 0; 2855fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2856fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2857fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!getDerived().AlwaysRebuild() && 2858fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.getScopeRep() == DTN->getQualifier() && 2859fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor ObjectType.isNull()) 2860fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return Name; 2861fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2862fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (DTN->isIdentifier()) { 2863fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, 2864fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor *DTN->getIdentifier(), 2865fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor NameLoc, 2866fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor ObjectType, 2867fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor FirstQualifierInScope); 2868fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2869fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2870fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 2871fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor ObjectType); 2872fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2873fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2874fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 2875fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateDecl *TransTemplate 2876fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 2877fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor Template)); 2878fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!TransTemplate) 2879fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(); 2880fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2881fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!getDerived().AlwaysRebuild() && 2882fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TransTemplate == Template) 2883fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return Name; 2884fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2885fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(TransTemplate); 2886fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2887fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2888fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (SubstTemplateTemplateParmPackStorage *SubstPack 2889fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = Name.getAsSubstTemplateTemplateParmPack()) { 2890fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateTemplateParmDecl *TransParam 2891fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = cast_or_null<TemplateTemplateParmDecl>( 2892fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 2893fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!TransParam) 2894fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(); 2895fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2896fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor if (!getDerived().AlwaysRebuild() && 2897fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TransParam == SubstPack->getParameterPack()) 2898fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return Name; 2899fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2900fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return getDerived().RebuildTemplateName(TransParam, 2901fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SubstPack->getArgumentPack()); 2902fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor } 2903fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2904fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // These should be getting filtered out before they reach the AST. 2905fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor llvm_unreachable("overloaded function decl survived to here"); 2906fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return TemplateName(); 2907fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor} 2908fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor 2909fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregortemplate<typename Derived> 2910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 2911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 2912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 2913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 2914670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 2915670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 29169f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("null template argument in TreeTransform"); 2917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 2920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 2921a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 2922c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2925788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 2926b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor case TemplateArgument::TemplateExpansion: { 2927b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor NestedNameSpecifierLocBuilder Builder; 2928b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor TemplateName Template = Arg.getAsTemplate(); 2929b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 2930b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 2931b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 2932b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 2933b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 2934b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (Arg.getKind() == TemplateArgument::Template) 2935b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Output = TemplateArgumentLoc(Arg, 2936b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Builder.getWithLocInContext(SemaRef.Context), 2937b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Loc); 2938b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor else 2939b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Output = TemplateArgumentLoc(Arg, 2940b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Builder.getWithLocInContext(SemaRef.Context), 2941b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Loc, Loc); 2942b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 2943a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor break; 2944b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor } 2945a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 2946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 2947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 2948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 2951670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 2952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 2953828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 2954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 2955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2957833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 2960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 2961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 2962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 2963833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 2964833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 2965833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 2966833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 2967833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 29681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2969670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 2970a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = Input.getTypeSourceInfo(); 2971833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 2972a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 2973833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2974833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 2975833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 2976833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2977833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 2978833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2979670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 29801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2981670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 2982833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 2983972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 2984972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 2985972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 2986788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), Name); 29877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl()); 2988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 2989833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2990828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 2991828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 2992828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 2993f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::Unevaluated); 299460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E = getDerived().TransformExpr(SourceExpr); 29959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SourceExpr = (E.isInvalid() ? 0 : E.take()); 2996828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 2997828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2998828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 2999833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 3000670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 30011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3002788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: { 3003b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3004b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (QualifierLoc) { 3005b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3006b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (!QualifierLoc) 3007b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor return true; 3008b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor } 3009b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor 3010c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName()); 3011788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateName Template 3012788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor = getDerived().TransformTemplateName(Arg.getAsTemplate()); 3013788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor if (Template.isNull()) 3014788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return true; 3015c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3016b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3017788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateNameLoc()); 3018788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return false; 3019788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor } 3020a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 3021a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 3022a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor llvm_unreachable("Caller should expand pack expansions"); 3023a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 3024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 3025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 30261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 3027f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::Unevaluated); 30281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3029833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 3030833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3031833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 303260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E 3033833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 3034833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 30359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take()); 3036833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 3037670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 30381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3039670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 3040670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 3041670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 30421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 3043670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 3044670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 30451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3046833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 3047833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 3048833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3049828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 3050828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 3051828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 3052828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 3053833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 3054833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 3055828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 3056670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 3057910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor 3058910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *TransformedArgsPtr 3059910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = new (getSema().Context) TemplateArgument[TransformedArgs.size()]; 3060910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::copy(TransformedArgs.begin(), TransformedArgs.end(), 3061910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TransformedArgsPtr); 3062910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Output = TemplateArgumentLoc(TemplateArgument(TransformedArgsPtr, 3063910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TransformedArgs.size()), 3064910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Input.getLocInfo()); 3065833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 3066670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 3067670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 30681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3069670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 3070833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 3071670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 3072670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 30737ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor/// \brief Iterator adaptor that invents template argument location information 30747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor/// for each of the template arguments in its underlying iterator. 30757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregortemplate<typename Derived, typename InputIterator> 30767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorclass TemplateArgumentLocInventIterator { 30777ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TreeTransform<Derived> &Self; 30787ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor InputIterator Iter; 30797ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 30807ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorpublic: 30817ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLoc value_type; 30827ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLoc reference; 30837ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef typename std::iterator_traits<InputIterator>::difference_type 30847ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor difference_type; 30857ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef std::input_iterator_tag iterator_category; 30867ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 30877ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor class pointer { 30887ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc Arg; 3089fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor 30907ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor public: 30917ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 30927ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 30937ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor const TemplateArgumentLoc *operator->() const { return &Arg; } 30947ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor }; 30957ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 30967ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocInventIterator() { } 30977ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 30987ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 30997ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor InputIterator Iter) 31007ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor : Self(Self), Iter(Iter) { } 31017ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 31027ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocInventIterator &operator++() { 31037ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ++Iter; 31047ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return *this; 3105fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor } 3106fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor 31077ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocInventIterator operator++(int) { 31087ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocInventIterator Old(*this); 31097ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ++(*this); 31107ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return Old; 31117ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 31127ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 31137ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor reference operator*() const { 31147ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc Result; 31157ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor Self.InventTemplateArgumentLoc(*Iter, Result); 31167ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return Result; 31177ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 31187ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 31197ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor pointer operator->() const { return pointer(**this); } 31207ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 31217ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor friend bool operator==(const TemplateArgumentLocInventIterator &X, 31227ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor const TemplateArgumentLocInventIterator &Y) { 31237ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return X.Iter == Y.Iter; 31247ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 3125fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor 31267ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor friend bool operator!=(const TemplateArgumentLocInventIterator &X, 31277ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor const TemplateArgumentLocInventIterator &Y) { 31287ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return X.Iter != Y.Iter; 31297ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 31307ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor}; 31317ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 31327f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregortemplate<typename Derived> 31337ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregortemplate<typename InputIterator> 31347ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorbool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First, 31357ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor InputIterator Last, 31367f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor TemplateArgumentListInfo &Outputs) { 31377ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor for (; First != Last; ++First) { 31387f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor TemplateArgumentLoc Out; 31397ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc In = *First; 31408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 31418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (In.getArgument().getKind() == TemplateArgument::Pack) { 31428491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // Unpack argument packs, which we translate them into separate 31438491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // arguments. 31447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor // FIXME: We could do much better if we could guarantee that the 31457ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor // TemplateArgumentLocInfo for the pack expansion would be usable for 31467ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor // all of the template arguments in the argument pack. 31477ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLocInventIterator<Derived, 31487ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgument::pack_iterator> 31497ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor PackLocIterator; 31507ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor if (TransformTemplateArguments(PackLocIterator(*this, 31517ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor In.getArgument().pack_begin()), 31527ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor PackLocIterator(*this, 31537ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor In.getArgument().pack_end()), 31547ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor Outputs)) 31557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return true; 31568491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 31578491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor continue; 31588491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 31598491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 31608491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (In.getArgument().isPackExpansion()) { 31618491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // We have a pack expansion, for which we will be substituting into 31628491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // the pattern. 31638491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor SourceLocation Ellipsis; 3164cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> OrigNumExpansions; 31658491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor TemplateArgumentLoc Pattern 3166cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor = In.getPackExpansionPattern(Ellipsis, OrigNumExpansions, 3167cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor getSema().Context); 31688491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 31698491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; 31708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 31718491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 31728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 31738491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // Determine whether the set of unexpanded parameter packs can and should 31748491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // be expanded. 31758491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor bool Expand = true; 3176d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 3177cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 31788491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (getDerived().TryExpandParameterPacks(Ellipsis, 31798491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Pattern.getSourceRange(), 31808491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Unexpanded.data(), 31818491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Unexpanded.size(), 3182d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor Expand, 3183d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 3184d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 31858491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return true; 31868491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 31878491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (!Expand) { 31888491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // The transform has determined that we should perform a simple 31898491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // transformation on the pack expansion, producing another pack 31908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // expansion. 31918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor TemplateArgumentLoc OutPattern; 31928491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 31938491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (getDerived().TransformTemplateArgument(Pattern, OutPattern)) 31948491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return true; 31958491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 3196cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 3197cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions); 31988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (Out.getArgument().isNull()) 31998491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return true; 32008491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 32018491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Outputs.addArgument(Out); 32028491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor continue; 32038491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 32048491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 32058491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // The transform has determined that we should perform an elementwise 32068491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // expansion of the pattern. Do so. 3207cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 32088491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 32098491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 32108491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (getDerived().TransformTemplateArgument(Pattern, Out)) 32118491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return true; 32128491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 321377d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor if (Out.getArgument().containsUnexpandedParameterPack()) { 3214cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3215cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor OrigNumExpansions); 321677d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor if (Out.getArgument().isNull()) 321777d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor return true; 321877d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor } 321977d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor 32208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Outputs.addArgument(Out); 32218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 32228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 32233cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor // If we're supposed to retain a pack expansion, do so by temporarily 32243cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor // forgetting the partially-substituted parameter pack. 32253cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (RetainExpansion) { 32263cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 32273cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor 32283cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (getDerived().TransformTemplateArgument(Pattern, Out)) 32293cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor return true; 32303cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor 3231cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3232cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor OrigNumExpansions); 32333cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (Out.getArgument().isNull()) 32343cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor return true; 32353cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor 32363cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor Outputs.addArgument(Out); 32373cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor } 3238d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 32398491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor continue; 32408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 32418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 32428491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // The simple case: 32438491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor if (getDerived().TransformTemplateArgument(In, Out)) 32447f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor return true; 32457f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 32467f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor Outputs.addArgument(Out); 32477f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor } 32487f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 32497f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor return false; 32507f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 32517f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor} 32527f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor 3253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 3254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 3255577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 3256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 325843fed0de4f5bc189e45562491f83d5193eb8dac0John McCallQualType TreeTransform<Derived>::TransformType(QualType T) { 3259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 3260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 3263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 3264c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 3265c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor getDerived().getBaseLocation()); 3266c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 326743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeSourceInfo *NewDI = getDerived().TransformType(DI); 32681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 3270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 32711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 3273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 32741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 327643fed0de4f5bc189e45562491f83d5193eb8dac0John McCallTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 3277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 3278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 32791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 32811bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 3282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 3283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 32841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType Result = getDerived().TransformType(TLB, TL); 3286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3289a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 32911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 329443fed0de4f5bc189e45562491f83d5193eb8dac0John McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 3295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 3296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 3297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 3298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 329943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 3300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 3301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 33039f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("unhandled type loc!"); 3304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 33061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 3308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 3309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 3310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 3311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 33131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 3314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 331543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualifiedTypeLoc T) { 3316a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers Quals = T.getType().getLocalQualifiers(); 3317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 331843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 3319a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 3323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 3324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 3325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 3326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 33271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33282865474261a608c7873b87ba4af110d17907896dJohn McCall if (!Quals.empty()) { 33292865474261a608c7873b87ba4af110d17907896dJohn McCall Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); 33302865474261a608c7873b87ba4af110d17907896dJohn McCall TLB.push<QualifiedTypeLoc>(Result); 33312865474261a608c7873b87ba4af110d17907896dJohn McCall // No location information to preserve. 33322865474261a608c7873b87ba4af110d17907896dJohn McCall } 3333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 3336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 333743fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate<typename Derived> 3338b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTypeLoc 3339b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 334043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType, 334143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *UnqualLookup, 3342b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor CXXScopeSpec &SS) { 3343b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor QualType T = TL.getType(); 334443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (getDerived().AlreadyTransformed(T)) 3345b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TL; 3346b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 334743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeLocBuilder TLB; 334843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType Result; 3349b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 335043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (isa<TemplateSpecializationType>(T)) { 3351b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TemplateSpecializationTypeLoc SpecTL 3352b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = cast<TemplateSpecializationTypeLoc>(TL); 3353b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 335443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateName Template = 3355b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor getDerived().TransformTemplateName(SS, 3356b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SpecTL.getTypePtr()->getTemplateName(), 3357b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SpecTL.getTemplateNameLoc(), 335843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjectType, UnqualLookup); 3359b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor if (Template.isNull()) 3360b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TypeLoc(); 3361b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 3362b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3363b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Template); 336443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } else if (isa<DependentTemplateSpecializationType>(T)) { 3365b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor DependentTemplateSpecializationTypeLoc SpecTL 3366b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = cast<DependentTemplateSpecializationTypeLoc>(TL); 3367a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 3368b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TemplateName Template 3369b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = getDerived().RebuildTemplateName(SS, 3370b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor *SpecTL.getTypePtr()->getIdentifier(), 3371b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SpecTL.getNameLoc(), 3372b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor ObjectType, UnqualLookup); 3373a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (Template.isNull()) 3374b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TypeLoc(); 3375b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 3376b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3377b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor SpecTL, 3378a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor Template); 337943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } else { 338043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // Nothing special needs to be done for these. 3381b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Result = getDerived().TransformType(TLB, TL); 338243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } 3383b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 3384b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor if (Result.isNull()) 3385b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TypeLoc(); 3386b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor 3387b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc(); 338843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall} 338943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 3390c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename Derived> 3391b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTypeSourceInfo * 3392b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3393c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType ObjectType, 3394c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NamedDecl *UnqualLookup, 3395c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor CXXScopeSpec &SS) { 3396c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // FIXME: Painfully copy-paste from the above! 3397c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3398b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor QualType T = TSInfo->getType(); 3399c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (getDerived().AlreadyTransformed(T)) 3400b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TSInfo; 3401c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3402c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TypeLocBuilder TLB; 3403c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualType Result; 3404c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3405b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TypeLoc TL = TSInfo->getTypeLoc(); 3406c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (isa<TemplateSpecializationType>(T)) { 3407c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateSpecializationTypeLoc SpecTL 3408c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = cast<TemplateSpecializationTypeLoc>(TL); 3409c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3410b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor TemplateName Template 3411b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor = getDerived().TransformTemplateName(SS, 3412fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SpecTL.getTypePtr()->getTemplateName(), 3413fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SpecTL.getTemplateNameLoc(), 3414c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor ObjectType, UnqualLookup); 3415c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (Template.isNull()) 3416b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return 0; 3417c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3418c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3419c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Template); 3420c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } else if (isa<DependentTemplateSpecializationType>(T)) { 3421c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor DependentTemplateSpecializationTypeLoc SpecTL 3422c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = cast<DependentTemplateSpecializationTypeLoc>(TL); 3423c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3424a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TemplateName Template 3425fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor = getDerived().RebuildTemplateName(SS, 34267c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor *SpecTL.getTypePtr()->getIdentifier(), 3427fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SpecTL.getNameLoc(), 34287c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor ObjectType, UnqualLookup); 3429a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (Template.isNull()) 3430b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return 0; 3431a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 3432c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3433a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor SpecTL, 3434b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor Template); 3435c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } else { 3436c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // Nothing special needs to be done for these. 3437c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Result = getDerived().TransformType(TLB, TL); 3438c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor } 3439c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3440c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (Result.isNull()) 3441b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return 0; 3442c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3443b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3444c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor} 3445c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 3446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 3447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 3448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 3449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 3450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 3451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 3452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 3454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 345543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall BuiltinTypeLoc T) { 3456ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 3457ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.setBuiltinLoc(T.getBuiltinLoc()); 3458ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor if (T.needsExtraLocalData()) 3459ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 3460ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return T.getType(); 3461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 34631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 346543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ComplexTypeLoc T) { 3466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 3467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 3468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 34691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 3471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 347243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall PointerTypeLoc TL) { 3473c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt QualType PointeeType 3474c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt = getDerived().TransformType(TLB, TL.getPointeeLoc()); 347592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (PointeeType.isNull()) 347692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return QualType(); 347792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 347892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor QualType Result = TL.getType(); 3479c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (PointeeType->getAs<ObjCObjectType>()) { 348092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // A dependent pointer type 'T *' has is being transformed such 348192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // that an Objective-C class type is being replaced for 'T'. The 348292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // resulting pointer type is an ObjCObjectPointerType, not a 348392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // PointerType. 3484c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 3485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3486c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 3487c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall NewT.setStarLoc(TL.getStarLoc()); 348892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return Result; 348992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 349043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 349192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (getDerived().AlwaysRebuild() || 349292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor PointeeType != TL.getPointeeLoc().getType()) { 349392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 349492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Result.isNull()) 349592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return QualType(); 349692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 3497c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 349892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 349992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor NewT.setSigilLoc(TL.getSigilLoc()); 3500c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return Result; 3501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 35031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 3505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 350643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall BlockPointerTypeLoc TL) { 3507db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor QualType PointeeType 3508c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3509c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt if (PointeeType.isNull()) 3510c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return QualType(); 3511c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3512c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt QualType Result = TL.getType(); 3513c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt if (getDerived().AlwaysRebuild() || 3514c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt PointeeType != TL.getPointeeLoc().getType()) { 3515c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Result = getDerived().RebuildBlockPointerType(PointeeType, 3516db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor TL.getSigilLoc()); 3517db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor if (Result.isNull()) 3518db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor return QualType(); 3519db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor } 3520db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor 352139968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 3522db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor NewT.setSigilLoc(TL.getSigilLoc()); 3523db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor return Result; 3524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 352685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 352785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 352885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 352985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 353085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 353185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 353285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 353343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ReferenceTypeLoc TL) { 353485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 353585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 353685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 353785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 353885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 353985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 354085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 354185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 354285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 354385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 354485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 354585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 354685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 354785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 354885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 354985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 355085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 355185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 355285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 355385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 355485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 355585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 355685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 355785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 355885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 355985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 356085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 356185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 3562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 3563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 356543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall LValueReferenceTypeLoc TL) { 356643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return TransformReferenceType(TLB, TL); 3567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 3570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 357243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall RValueReferenceTypeLoc TL) { 357343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return TransformReferenceType(TLB, TL); 3574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 35751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 35771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 3578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 357943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall MemberPointerTypeLoc TL) { 3580f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const MemberPointerType *T = TL.getTypePtr(); 3581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 3584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 3587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 3588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 3589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 3590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 3595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 359685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 359785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 3598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 3603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 3604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 36081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 3610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 361143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ConstantArrayTypeLoc TL) { 3612f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const ConstantArrayType *T = TL.getTypePtr(); 3613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 36161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 3620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 3621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 3622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 362385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 362485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 3625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3628c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 3630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 3631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 36321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 3634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 3635f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 3636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 3637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 3639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 36421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 3645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 364643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall IncompleteArrayTypeLoc TL) { 3647f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const IncompleteArrayType *T = TL.getTypePtr(); 3648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 36511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 3655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 3656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 365785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 365885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 3659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3662c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 3664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 3665a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 3666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 3667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 36701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 367443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall VariableArrayTypeLoc TL) { 3675f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const VariableArrayType *T = TL.getTypePtr(); 3676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3680670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 3681f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 3682670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 368360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SizeResult 3684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 3685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 3686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 36871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Size = SizeResult.take(); 3689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 3693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 3694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 3695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 36969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Size, 3697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 369885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 3699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 3702c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 3704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 3705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 3706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 3713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 371443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentSizedArrayTypeLoc TL) { 3715f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DependentSizedArrayType *T = TL.getTypePtr(); 3716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3718577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 37191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3720670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 3721f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 37221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37233b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall // Prefer the expression from the TypeLoc; the other may have been uniqued. 37243b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Expr *origSize = TL.getSizeExpr(); 37253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (!origSize) origSize = T->getSizeExpr(); 37263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall 37273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall ExprResult sizeResult 37283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall = getDerived().TransformExpr(origSize); 37293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall if (sizeResult.isInvalid()) 3730577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 37311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall Expr *size = sizeResult.get(); 3733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 37373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall size != origSize) { 3738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 3739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 37403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall size, 3741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 374285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 3743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3745577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 37461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 3748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 3749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 3750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 3751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 37523b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall NewTL.setSizeExpr(size); 3753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3755577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 37561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3758577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 3759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 376043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentSizedExtVectorTypeLoc TL) { 3761f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DependentSizedExtVectorType *T = TL.getTypePtr(); 3762a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 3764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 3765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 37671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3768670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 3769f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 3770670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 377160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 3772577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 3773577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 37741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3777eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 3778eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 3779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 37809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Size.take(), 3781577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 3782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 3787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 3788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 3789a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 3790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 3791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 3792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 3793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 3794a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3796a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3797577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 37981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3800a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 380143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall VectorTypeLoc TL) { 3802f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const VectorType *T = TL.getTypePtr(); 3803577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 3804577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3805577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 3806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3807a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3808a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 381082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 3811e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson T->getVectorKind()); 3812a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3814a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3815c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 3817a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 38181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3819a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3820577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 38211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3823a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 382443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ExtVectorTypeLoc TL) { 3825f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const VectorType *T = TL.getTypePtr(); 3826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 3827577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 3828577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 38291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3830a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 3831a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 3832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 3833a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 3834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 3835a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 3836a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 3837a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 3838a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 3839c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3840a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 3841a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 38421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3843a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 3844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3845577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 38461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 384721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl * 38486a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas GregorTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm, 38496a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor llvm::Optional<unsigned> NumExpansions) { 385021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 38516a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TypeSourceInfo *NewDI = 0; 38526a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 38536a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 38546a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor // If we're substituting into a pack expansion type and we know the 38556a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TypeLoc OldTL = OldDI->getTypeLoc(); 38566a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor PackExpansionTypeLoc OldExpansionTL = cast<PackExpansionTypeLoc>(OldTL); 38576a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 38586a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TypeLocBuilder TLB; 38596a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TypeLoc NewTL = OldDI->getTypeLoc(); 38606a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor TLB.reserve(NewTL.getFullDataSize()); 38616a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 38626a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor QualType Result = getDerived().TransformType(TLB, 38636a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OldExpansionTL.getPatternLoc()); 38646a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor if (Result.isNull()) 38656a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor return 0; 38666a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 38676a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor Result = RebuildPackExpansionType(Result, 38686a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OldExpansionTL.getPatternLoc().getSourceRange(), 38696a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OldExpansionTL.getEllipsisLoc(), 38706a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NumExpansions); 38716a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor if (Result.isNull()) 38726a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor return 0; 38736a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor 38746a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor PackExpansionTypeLoc NewExpansionTL 38756a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor = TLB.push<PackExpansionTypeLoc>(Result); 38766a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 38776a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 38786a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor } else 38796a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NewDI = getDerived().TransformType(OldDI); 388021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewDI) 388121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return 0; 388221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 388321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (NewDI == OldDI) 388421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return OldParm; 388521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall else 388621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return ParmVarDecl::Create(SemaRef.Context, 388721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getDeclContext(), 388821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getLocation(), 388921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getIdentifier(), 389021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewDI->getType(), 389121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall NewDI, 389221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall OldParm->getStorageClass(), 389316573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor OldParm->getStorageClassAsWritten(), 389421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall /* DefArg */ NULL); 389521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall} 389621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 389721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived> 389821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>:: 3899a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TransformFunctionTypeParams(SourceLocation Loc, 3900a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor ParmVarDecl **Params, unsigned NumParams, 3901a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor const QualType *ParamTypes, 3902a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor llvm::SmallVectorImpl<QualType> &OutParamTypes, 3903a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl*> *PVars) { 3904a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor for (unsigned i = 0; i != NumParams; ++i) { 3905a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (ParmVarDecl *OldParm = Params[i]) { 39066a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor llvm::Optional<unsigned> NumExpansions; 3907406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor ParmVarDecl *NewParm = 0; 3908603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (OldParm->isParameterPack()) { 3909603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We have a function parameter pack that may need to be expanded. 3910603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3911603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3912603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Find the parameter packs that could be expanded. 3913c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 3914c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(TL); 3915c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor TypeLoc Pattern = ExpansionTL.getPatternLoc(); 3916c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 3917406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 3918406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor 3919603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Determine whether we should expand the parameter packs. 3920603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor bool ShouldExpand = false; 3921d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 39226a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor llvm::Optional<unsigned> OrigNumExpansions 39236a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor = ExpansionTL.getTypePtr()->getNumExpansions(); 39246a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor NumExpansions = OrigNumExpansions; 3925c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 3926c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor Pattern.getSourceRange(), 3927603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Unexpanded.data(), 3928603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Unexpanded.size(), 3929d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ShouldExpand, 3930d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 3931d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) { 3932603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor return true; 3933603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3934603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3935603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (ShouldExpand) { 3936603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Expand the function parameter pack into multiple, separate 3937603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // parameters. 393812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor getDerived().ExpandingFunctionParameterPack(OldParm); 3939cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 3940603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3941603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor ParmVarDecl *NewParm 39426a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor = getDerived().TransformFunctionTypeParam(OldParm, 39436a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OrigNumExpansions); 3944603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (!NewParm) 3945603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor return true; 3946603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3947a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor OutParamTypes.push_back(NewParm->getType()); 3948a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (PVars) 3949a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor PVars->push_back(NewParm); 3950603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3951d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 3952d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor // If we're supposed to retain a pack expansion, do so by temporarily 3953d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor // forgetting the partially-substituted parameter pack. 3954d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (RetainExpansion) { 3955d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3956d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ParmVarDecl *NewParm 39576a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor = getDerived().TransformFunctionTypeParam(OldParm, 39586a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor OrigNumExpansions); 3959d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (!NewParm) 3960d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor return true; 3961d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 3962d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor OutParamTypes.push_back(NewParm->getType()); 3963d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (PVars) 3964d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor PVars->push_back(NewParm); 3965d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor } 3966d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 3967603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We're done with the pack expansion. 3968603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor continue; 3969603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3970603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3971603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We'll substitute the parameter now without expanding the pack 3972603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // expansion. 3973406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3974406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NewParm = getDerived().TransformFunctionTypeParam(OldParm, 3975406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NumExpansions); 3976406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor } else { 3977406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NewParm = getDerived().TransformFunctionTypeParam(OldParm, 3978406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor llvm::Optional<unsigned>()); 3979603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3980406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor 398121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewParm) 398221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return true; 3983603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 3984a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor OutParamTypes.push_back(NewParm->getType()); 3985a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (PVars) 3986a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor PVars->push_back(NewParm); 3987603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor continue; 3988603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 3989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 3990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 3991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 3992a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor QualType OldType = ParamTypes[i]; 3993603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor bool IsPackExpansion = false; 3994cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions; 3995406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor QualType NewType; 3996603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (const PackExpansionType *Expansion 3997603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor = dyn_cast<PackExpansionType>(OldType)) { 3998603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We have a function parameter pack that may need to be expanded. 3999603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor QualType Pattern = Expansion->getPattern(); 4000603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4001603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4002603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 4003603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Determine whether we should expand the parameter packs. 4004603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor bool ShouldExpand = false; 4005d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 4006a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 4007603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Unexpanded.data(), 4008603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Unexpanded.size(), 4009d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ShouldExpand, 4010d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 4011d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) { 401221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return true; 4013603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 4014603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 4015603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (ShouldExpand) { 4016603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // Expand the function parameter pack into multiple, separate 4017603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // parameters. 4018cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 4019603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4020603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor QualType NewType = getDerived().TransformType(Pattern); 4021603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (NewType.isNull()) 4022603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor return true; 4023603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 4024a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor OutParamTypes.push_back(NewType); 4025a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (PVars) 4026a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor PVars->push_back(0); 4027603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 4028603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 4029603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We're done with the pack expansion. 4030603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor continue; 4031603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 4032603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 40333cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor // If we're supposed to retain a pack expansion, do so by temporarily 40343cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor // forgetting the partially-substituted parameter pack. 40353cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (RetainExpansion) { 40363cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 40373cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor QualType NewType = getDerived().TransformType(Pattern); 40383cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (NewType.isNull()) 40393cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor return true; 40403cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor 40413cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor OutParamTypes.push_back(NewType); 40423cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor if (PVars) 40433cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor PVars->push_back(0); 40443cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor } 4045d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 4046603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // We'll substitute the parameter now without expanding the pack 4047603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor // expansion. 4048603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor OldType = Expansion->getPattern(); 4049603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor IsPackExpansion = true; 4050406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4051406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NewType = getDerived().TransformType(OldType); 4052406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor } else { 4053406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor NewType = getDerived().TransformType(OldType); 4054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 4055603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 4056603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (NewType.isNull()) 4057603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor return true; 40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4059603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor if (IsPackExpansion) 4060cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NewType = getSema().Context.getPackExpansionType(NewType, 4061cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions); 4062603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor 4063a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor OutParamTypes.push_back(NewType); 4064a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (PVars) 4065a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor PVars->push_back(0); 4066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 40671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 406821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return false; 4069603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor } 407021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall 407121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived> 407221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType 407321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 407443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FunctionProtoTypeLoc TL) { 40757e010a04fef171049291d8cb3047f118566da090Douglas Gregor // Transform the parameters and return type. 40767e010a04fef171049291d8cb3047f118566da090Douglas Gregor // 40777e010a04fef171049291d8cb3047f118566da090Douglas Gregor // We instantiate in source order, with the return type first followed by 40787e010a04fef171049291d8cb3047f118566da090Douglas Gregor // the parameters, because users tend to expect this (even if they shouldn't 40797e010a04fef171049291d8cb3047f118566da090Douglas Gregor // rely on it!). 40807e010a04fef171049291d8cb3047f118566da090Douglas Gregor // 4081dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor // When the function has a trailing return type, we instantiate the 4082dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor // parameters before the return type, since the return type can then refer 4083dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor // to the parameters themselves (via decltype, sizeof, etc.). 4084dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor // 408521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVector<QualType, 4> ParamTypes; 408621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 4087f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const FunctionProtoType *T = TL.getTypePtr(); 40887e010a04fef171049291d8cb3047f118566da090Douglas Gregor 4089dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor QualType ResultType; 4090dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 4091dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor if (TL.getTrailingReturn()) { 4092a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 4093a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getParmArray(), 4094a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getNumArgs(), 4095a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getTypePtr()->arg_type_begin(), 4096a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor ParamTypes, &ParamDecls)) 4097dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return QualType(); 4098dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 4099dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4100dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor if (ResultType.isNull()) 4101dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return QualType(); 4102dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor } 4103dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor else { 4104dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4105dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor if (ResultType.isNull()) 4106dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return QualType(); 4107dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 4108a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 4109a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getParmArray(), 4110a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getNumArgs(), 4111a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor TL.getTypePtr()->arg_type_begin(), 4112a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor ParamTypes, &ParamDecls)) 4113dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return QualType(); 4114dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor } 4115dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 4116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 4119bd5f9f708aa31920d3bd73aa10fcb5de424c657aDouglas Gregor T->getNumArgs() != ParamTypes.size() || 4120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 4121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 4122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 4123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 4124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 4125fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman T->getTypeQuals(), 4126c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor T->getRefQualifier(), 4127fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman T->getExtInfo()); 4128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 4133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 4134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 4135dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor NewTL.setTrailingReturn(TL.getTrailingReturn()); 4136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 4137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 4138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 41411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4142577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 4144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 414543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall FunctionNoProtoTypeLoc TL) { 4146f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const FunctionNoProtoType *T = TL.getTypePtr(); 4147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 4149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 4154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 4155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 4157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 4158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 4159dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor NewTL.setTrailingReturn(false); 4160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4164ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType 4165ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 416643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall UnresolvedUsingTypeLoc TL) { 4167f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const UnresolvedUsingType *T = TL.getTypePtr(); 41687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 4169ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (!D) 4170ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 4171ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 4172ed97649e9574b9d854fa4d6109c9333ae0993554John McCall QualType Result = TL.getType(); 4173ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 4174ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Result = getDerived().RebuildUnresolvedUsingType(D); 4175ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (Result.isNull()) 4176ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return QualType(); 4177ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 4178ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 4179ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // We might get an arbitrary type spec type back. We should at 4180ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // least always get a type spec type, though. 4181ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 4182ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewTL.setNameLoc(TL.getNameLoc()); 4183ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 4184ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return Result; 4185ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 4186ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 4187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 418943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypedefTypeLoc TL) { 4190f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const TypedefType *T = TL.getTypePtr(); 4191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 41927c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(), 41937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 4194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 4195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 41961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 4200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 4201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4203a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 4204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 4206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 42071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 42101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4212a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 421343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeOfExprTypeLoc TL) { 4214670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 4215f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 42161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 421760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 4218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 4219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 4220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4221a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4222a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4223cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall E.get() != TL.getUnderlyingExpr()) { 42242a984cad5ac3fdceeff2bd99daa7b90979313475John McCall Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 4225a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4226a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4228a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4230a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 4231cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 4232cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 4233cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 4234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4235a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 424043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeOfTypeLoc TL) { 4241cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 4242cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 4243cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (!New_Under_TI) 4244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 42451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4247cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 4248cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 4249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4251a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 42521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 4254cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setTypeofLoc(TL.getTypeofLoc()); 4255cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 4256cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 4257cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall NewTL.setUnderlyingTInfo(New_Under_TI); 4258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4259a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 42611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 426443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DecltypeTypeLoc TL) { 4265f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DecltypeType *T = TL.getTypePtr(); 4266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4267670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 4268f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 42691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 427060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 4271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 4272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 42731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 42772a984cad5ac3fdceeff2bd99daa7b90979313475John McCall Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 4278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 4282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 4284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 42851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 429034b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 429134b41d939a1328f484511c6002ba2456db879a29Richard Smith AutoTypeLoc TL) { 429234b41d939a1328f484511c6002ba2456db879a29Richard Smith const AutoType *T = TL.getTypePtr(); 429334b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType OldDeduced = T->getDeducedType(); 429434b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType NewDeduced; 429534b41d939a1328f484511c6002ba2456db879a29Richard Smith if (!OldDeduced.isNull()) { 429634b41d939a1328f484511c6002ba2456db879a29Richard Smith NewDeduced = getDerived().TransformType(OldDeduced); 429734b41d939a1328f484511c6002ba2456db879a29Richard Smith if (NewDeduced.isNull()) 429834b41d939a1328f484511c6002ba2456db879a29Richard Smith return QualType(); 429934b41d939a1328f484511c6002ba2456db879a29Richard Smith } 430034b41d939a1328f484511c6002ba2456db879a29Richard Smith 430134b41d939a1328f484511c6002ba2456db879a29Richard Smith QualType Result = TL.getType(); 430234b41d939a1328f484511c6002ba2456db879a29Richard Smith if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced) { 430334b41d939a1328f484511c6002ba2456db879a29Richard Smith Result = getDerived().RebuildAutoType(NewDeduced); 430434b41d939a1328f484511c6002ba2456db879a29Richard Smith if (Result.isNull()) 430534b41d939a1328f484511c6002ba2456db879a29Richard Smith return QualType(); 430634b41d939a1328f484511c6002ba2456db879a29Richard Smith } 430734b41d939a1328f484511c6002ba2456db879a29Richard Smith 430834b41d939a1328f484511c6002ba2456db879a29Richard Smith AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 430934b41d939a1328f484511c6002ba2456db879a29Richard Smith NewTL.setNameLoc(TL.getNameLoc()); 431034b41d939a1328f484511c6002ba2456db879a29Richard Smith 431134b41d939a1328f484511c6002ba2456db879a29Richard Smith return Result; 431234b41d939a1328f484511c6002ba2456db879a29Richard Smith} 431334b41d939a1328f484511c6002ba2456db879a29Richard Smith 431434b41d939a1328f484511c6002ba2456db879a29Richard Smithtemplate<typename Derived> 4315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 431643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall RecordTypeLoc TL) { 4317f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const RecordType *T = TL.getTypePtr(); 4318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 43197c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 43207c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 4321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 4322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 43231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 4327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 4328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4332a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 4333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 4334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 434043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall EnumTypeLoc TL) { 4341f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const EnumType *T = TL.getTypePtr(); 4342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 43437c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 43447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor T->getDecl())); 4345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 4346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 43471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 4350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 4351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 4352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 4355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 4357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 43581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 43617da2431c23ef1ee8acb114e39692246e1801afc2John McCall 43623cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived> 43633cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType( 43643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeLocBuilder &TLB, 436543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall InjectedClassNameTypeLoc TL) { 43663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 43673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TL.getTypePtr()->getDecl()); 43683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!D) return QualType(); 43693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 43703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 43713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 43723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return T; 43733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 43743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 4375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 4377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 437843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateTypeParmTypeLoc TL) { 4379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 4380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 43821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 438349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 4384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 438543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall SubstTemplateTypeParmTypeLoc TL) { 4386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 438749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 438849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 438949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 4390c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 4391c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor TypeLocBuilder &TLB, 4392c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackTypeLoc TL) { 4393c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor return TransformTypeSpecType(TLB, TL); 4394c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 4395c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 4396c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregortemplate<typename Derived> 4397833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 439843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TypeLocBuilder &TLB, 439943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateSpecializationTypeLoc TL) { 440043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 4401828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 440243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateName Template 440343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall = getDerived().TransformTemplateName(T->getTemplateName()); 440443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (Template.isNull()) 440543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return QualType(); 4406833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 440743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 4408dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 440943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 44107ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregornamespace { 44117ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// \brief Simple iterator that traverses the template arguments in a 44127ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// container that provides a \c getArgLoc() member function. 44137ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// 44147ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// This iterator is intended to be used with the iterator form of 44157ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor /// \c TreeTransform<Derived>::TransformTemplateArguments(). 44167ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor template<typename ArgLocContainer> 44177ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor class TemplateArgumentLocContainerIterator { 44187ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ArgLocContainer *Container; 44197ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor unsigned Index; 44207ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44217ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor public: 44227ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLoc value_type; 44237ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLoc reference; 44247ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef int difference_type; 44257ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef std::input_iterator_tag iterator_category; 44267ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44277ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor class pointer { 44287ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc Arg; 44297ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44307ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor public: 44317ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 44327ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44337ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor const TemplateArgumentLoc *operator->() const { 44347ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return &Arg; 44357ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 44367ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor }; 44377ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44387ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44397ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator() {} 44407ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44417ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 44427ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor unsigned Index) 44437ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor : Container(&Container), Index(Index) { } 44447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44457ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator &operator++() { 44467ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ++Index; 44477ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return *this; 44487ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 44497ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44507ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator operator++(int) { 44517ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLocContainerIterator Old(*this); 44527ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ++(*this); 44537ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return Old; 44547ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 44557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44567ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor TemplateArgumentLoc operator*() const { 44577ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return Container->getArgLoc(Index); 44587ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 44597ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44607ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor pointer operator->() const { 44617ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return pointer(Container->getArgLoc(Index)); 44627ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 44637ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44647ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor friend bool operator==(const TemplateArgumentLocContainerIterator &X, 4465f7dd69969aa25093ca9a7897a0d8819c145d1c77Douglas Gregor const TemplateArgumentLocContainerIterator &Y) { 44667ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return X.Container == Y.Container && X.Index == Y.Index; 44677ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 44687ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44697ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 4470f7dd69969aa25093ca9a7897a0d8819c145d1c77Douglas Gregor const TemplateArgumentLocContainerIterator &Y) { 44717ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor return !(X == Y); 44727ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor } 44737ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor }; 44747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor} 44757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 44767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor 447743fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate <typename Derived> 4478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 4479833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 4480833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 448143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TemplateName Template) { 4482d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo NewTemplateArgs; 4483d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 4484d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 44857ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 44867ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ArgIterator; 44877ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 44887ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ArgIterator(TL, TL.getNumArgs()), 44897ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor NewTemplateArgs)) 44907f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor return QualType(); 44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4492833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 4493833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 4494833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 4495833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 4496833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 4497d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs); 44981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4499833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 4500833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 4501833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 4502833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4503833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 4504833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 4505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4506833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 45081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4509833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 4510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4512a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregortemplate <typename Derived> 4513a88f09f34e86125ee4e6949a757aaed314012664Douglas GregorQualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 4514a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TypeLocBuilder &TLB, 4515a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DependentTemplateSpecializationTypeLoc TL, 4516a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TemplateName Template) { 4517a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TemplateArgumentListInfo NewTemplateArgs; 4518a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 4519a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 4520a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor typedef TemplateArgumentLocContainerIterator< 4521a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DependentTemplateSpecializationTypeLoc> ArgIterator; 4522a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 4523a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor ArgIterator(TL, TL.getNumArgs()), 4524a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs)) 4525a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor return QualType(); 4526a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4527a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor // FIXME: maybe don't rebuild if all the template arguments are the same. 4528a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4529a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 4530a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor QualType Result 4531a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor = getSema().Context.getDependentTemplateSpecializationType( 4532a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TL.getTypePtr()->getKeyword(), 4533a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DTN->getQualifier(), 4534a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DTN->getIdentifier(), 4535a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs); 4536a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4537a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor DependentTemplateSpecializationTypeLoc NewTL 4538a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 4539a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setKeywordLoc(TL.getKeywordLoc()); 454094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 454194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // FIXME: Poor nested-name-specifier source-location information. 454294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor CXXScopeSpec SS; 454394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor SS.MakeTrivial(SemaRef.Context, 454494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor DTN->getQualifier(), TL.getQualifierLoc().getSourceRange()); 454594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 4546a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setNameLoc(TL.getNameLoc()); 4547a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setLAngleLoc(TL.getLAngleLoc()); 4548a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setRAngleLoc(TL.getRAngleLoc()); 4549a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4550a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4551a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor return Result; 4552a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor } 4553a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4554a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor QualType Result 4555a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor = getDerived().RebuildTemplateSpecializationType(Template, 4556a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TL.getNameLoc(), 4557a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTemplateArgs); 4558a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4559a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor if (!Result.isNull()) { 4560a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor /// FIXME: Wrap this in an elaborated-type-specifier? 4561a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor TemplateSpecializationTypeLoc NewTL 4562a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor = TLB.push<TemplateSpecializationTypeLoc>(Result); 4563a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setTemplateNameLoc(TL.getNameLoc()); 4564a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setLAngleLoc(TL.getLAngleLoc()); 4565a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setRAngleLoc(TL.getRAngleLoc()); 4566a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4567a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4568a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor } 4569a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 4570a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor return Result; 4571a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor} 4572a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 45731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4575465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 457643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ElaboratedTypeLoc TL) { 4577f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const ElaboratedType *T = TL.getTypePtr(); 4578465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara 45799e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 4580465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara // NOTE: the qualifier in an ElaboratedType is optional. 45819e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor if (TL.getQualifierLoc()) { 45829e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualifierLoc 45839e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 45849e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor if (!QualifierLoc) 4585465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara return QualType(); 4586465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara } 45871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 458843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 458943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall if (NamedT.isNull()) 459043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return QualType(); 4591a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar 4592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 4593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 45949e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualifierLoc != TL.getQualifierLoc() || 4595e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NamedT != T->getNamedType()) { 459621e413fe6305a198564d436ac515497716c47844John McCall Result = getDerived().RebuildElaboratedType(TL.getKeywordLoc(), 45979e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor T->getKeyword(), 45989e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor QualifierLoc, NamedT); 4599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 4602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4603465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 4604e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NewTL.setKeywordLoc(TL.getKeywordLoc()); 46059e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NewTL.setQualifierLoc(QualifierLoc); 4606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 46081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 46109d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType TreeTransform<Derived>::TransformAttributedType( 46119d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall TypeLocBuilder &TLB, 46129d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedTypeLoc TL) { 46139d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall const AttributedType *oldType = TL.getTypePtr(); 46149d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 46159d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (modifiedType.isNull()) 46169d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return QualType(); 46179d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 46189d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType result = TL.getType(); 46199d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 46209d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall // FIXME: dependent operand expressions? 46219d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (getDerived().AlwaysRebuild() || 46229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall modifiedType != oldType->getModifiedType()) { 46239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall // TODO: this is really lame; we should really be rebuilding the 46249d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall // equivalent type from first principles. 46259d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall QualType equivalentType 46269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall = getDerived().TransformType(oldType->getEquivalentType()); 46279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (equivalentType.isNull()) 46289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return QualType(); 46299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 46309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall modifiedType, 46319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall equivalentType); 46329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall } 46339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 46349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 46359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall newTL.setAttrNameLoc(TL.getAttrNameLoc()); 46369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (TL.hasAttrOperand()) 46379d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 46389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (TL.hasAttrExprOperand()) 46399d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall newTL.setAttrExprOperand(TL.getAttrExprOperand()); 46409d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall else if (TL.hasAttrEnumOperand()) 46419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 46429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 46439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return result; 46449d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 46459d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 46469d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCalltemplate<typename Derived> 4647075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType 4648075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraTreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 4649075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenTypeLoc TL) { 4650075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 4651075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (Inner.isNull()) 4652075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(); 4653075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 4654075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara QualType Result = TL.getType(); 4655075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (getDerived().AlwaysRebuild() || 4656075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Inner != TL.getInnerLoc().getType()) { 4657075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Result = getDerived().RebuildParenType(Inner); 4658075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (Result.isNull()) 4659075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return QualType(); 4660075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara } 4661075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 4662075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 4663075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara NewTL.setLParenLoc(TL.getLParenLoc()); 4664075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara NewTL.setRParenLoc(TL.getRParenLoc()); 4665075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara return Result; 4666075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 4667075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 4668075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaratemplate<typename Derived> 46694714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, 467043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentNameTypeLoc TL) { 4671f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DependentNameType *T = TL.getTypePtr(); 4672833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 46732494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor NestedNameSpecifierLoc QualifierLoc 46742494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 46752494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor if (!QualifierLoc) 4676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 46771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 467833500955d731c73717af52088b7fc0e7a85681e7John McCall QualType Result 46792494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor = getDerived().RebuildDependentNameType(T->getKeyword(), 468033500955d731c73717af52088b7fc0e7a85681e7John McCall TL.getKeywordLoc(), 46812494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor QualifierLoc, 46822494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor T->getIdentifier(), 468333500955d731c73717af52088b7fc0e7a85681e7John McCall TL.getNameLoc()); 4684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 4685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 4686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4687e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 4688e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara QualType NamedT = ElabT->getNamedType(); 468933500955d731c73717af52088b7fc0e7a85681e7John McCall TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 469033500955d731c73717af52088b7fc0e7a85681e7John McCall 4691e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 4692e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NewTL.setKeywordLoc(TL.getKeywordLoc()); 46939e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NewTL.setQualifierLoc(QualifierLoc); 469433500955d731c73717af52088b7fc0e7a85681e7John McCall } else { 4695e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 4696e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NewTL.setKeywordLoc(TL.getKeywordLoc()); 46972494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor NewTL.setQualifierLoc(QualifierLoc); 4698e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara NewTL.setNameLoc(TL.getNameLoc()); 4699e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara } 4700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 4701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 47021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 470433500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>:: 470533500955d731c73717af52088b7fc0e7a85681e7John McCall TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 470643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentTemplateSpecializationTypeLoc TL) { 470794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 470894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (TL.getQualifierLoc()) { 470994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualifierLoc 471094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 471194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (!QualifierLoc) 4712a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor return QualType(); 4713a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor } 4714a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor 471543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return getDerived() 471694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 471743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall} 471843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 471943fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate<typename Derived> 472043fed0de4f5bc189e45562491f83d5193eb8dac0John McCallQualType TreeTransform<Derived>:: 472143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 472243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall DependentTemplateSpecializationTypeLoc TL, 472343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NestedNameSpecifier *NNS) { 472494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // FIXME: This routine needs to go away. 4725f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const DependentTemplateSpecializationType *T = TL.getTypePtr(); 472643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 472733500955d731c73717af52088b7fc0e7a85681e7John McCall TemplateArgumentListInfo NewTemplateArgs; 472833500955d731c73717af52088b7fc0e7a85681e7John McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 472933500955d731c73717af52088b7fc0e7a85681e7John McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 4730c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 4731c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor // FIXME: Nested-name-specifier source location info! 47327ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor typedef TemplateArgumentLocContainerIterator< 47337ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor DependentTemplateSpecializationTypeLoc> ArgIterator; 47347ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 47357ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor ArgIterator(TL, TL.getNumArgs()), 47367ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor NewTemplateArgs)) 47377f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor return QualType(); 473833500955d731c73717af52088b7fc0e7a85681e7John McCall 4739fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor CXXScopeSpec SS; 4740fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.MakeTrivial(SemaRef.Context, NNS, 4741fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TL.getQualifierLoc().getSourceRange()); 47421efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor QualType Result 47431efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(), 4744fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SS.getWithLocInContext(SemaRef.Context), 47451efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor T->getIdentifier(), 47461efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor TL.getNameLoc(), 47471efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor NewTemplateArgs); 474833500955d731c73717af52088b7fc0e7a85681e7John McCall if (Result.isNull()) 474933500955d731c73717af52088b7fc0e7a85681e7John McCall return QualType(); 475033500955d731c73717af52088b7fc0e7a85681e7John McCall 475133500955d731c73717af52088b7fc0e7a85681e7John McCall if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 475233500955d731c73717af52088b7fc0e7a85681e7John McCall QualType NamedT = ElabT->getNamedType(); 475333500955d731c73717af52088b7fc0e7a85681e7John McCall 475433500955d731c73717af52088b7fc0e7a85681e7John McCall // Copy information relevant to the template specialization. 475533500955d731c73717af52088b7fc0e7a85681e7John McCall TemplateSpecializationTypeLoc NamedTL 475633500955d731c73717af52088b7fc0e7a85681e7John McCall = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 475733500955d731c73717af52088b7fc0e7a85681e7John McCall NamedTL.setLAngleLoc(TL.getLAngleLoc()); 475833500955d731c73717af52088b7fc0e7a85681e7John McCall NamedTL.setRAngleLoc(TL.getRAngleLoc()); 475933500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 476033500955d731c73717af52088b7fc0e7a85681e7John McCall NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I)); 476133500955d731c73717af52088b7fc0e7a85681e7John McCall 476233500955d731c73717af52088b7fc0e7a85681e7John McCall // Copy information relevant to the elaborated type. 476333500955d731c73717af52088b7fc0e7a85681e7John McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 476433500955d731c73717af52088b7fc0e7a85681e7John McCall NewTL.setKeywordLoc(TL.getKeywordLoc()); 47659e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor 47669e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor // FIXME: DependentTemplateSpecializationType needs better source-location 47679e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor // info. 47689e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NestedNameSpecifierLocBuilder Builder; 476994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor Builder.MakeTrivial(SemaRef.Context, 477094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NNS, TL.getQualifierLoc().getSourceRange()); 47719e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NewTL.setQualifierLoc(Builder.getWithLocInContext(SemaRef.Context)); 477233500955d731c73717af52088b7fc0e7a85681e7John McCall } else { 4773e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor TypeLoc NewTL(Result, TL.getOpaqueData()); 4774e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor TLB.pushFullCopy(NewTL); 477533500955d731c73717af52088b7fc0e7a85681e7John McCall } 477633500955d731c73717af52088b7fc0e7a85681e7John McCall return Result; 477733500955d731c73717af52088b7fc0e7a85681e7John McCall} 477833500955d731c73717af52088b7fc0e7a85681e7John McCall 477933500955d731c73717af52088b7fc0e7a85681e7John McCalltemplate<typename Derived> 478094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorQualType TreeTransform<Derived>:: 478194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorTransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 478294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor DependentTemplateSpecializationTypeLoc TL, 478394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLoc QualifierLoc) { 478494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor const DependentTemplateSpecializationType *T = TL.getTypePtr(); 478594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 478694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TemplateArgumentListInfo NewTemplateArgs; 478794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 478894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 478994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 479094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor typedef TemplateArgumentLocContainerIterator< 479194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor DependentTemplateSpecializationTypeLoc> ArgIterator; 479294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 479394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor ArgIterator(TL, TL.getNumArgs()), 479494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTemplateArgs)) 479594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return QualType(); 479694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 479794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualType Result 479894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(), 479994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualifierLoc, 480094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor T->getIdentifier(), 480194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TL.getNameLoc(), 480294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTemplateArgs); 480394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (Result.isNull()) 480494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return QualType(); 480594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 480694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 480794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor QualType NamedT = ElabT->getNamedType(); 480894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 480994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // Copy information relevant to the template specialization. 481094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TemplateSpecializationTypeLoc NamedTL 481194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 481294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NamedTL.setLAngleLoc(TL.getLAngleLoc()); 481394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NamedTL.setRAngleLoc(TL.getRAngleLoc()); 481494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 481594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I)); 481694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 481794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor // Copy information relevant to the elaborated type. 481894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 481994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTL.setKeywordLoc(TL.getKeywordLoc()); 482094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NewTL.setQualifierLoc(QualifierLoc); 482194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } else { 482294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TypeLoc NewTL(Result, TL.getOpaqueData()); 482394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TLB.pushFullCopy(NewTL); 482494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } 482594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor return Result; 482694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor} 482794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 482894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregortemplate<typename Derived> 48297536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorQualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 48307536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor PackExpansionTypeLoc TL) { 48312fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor QualType Pattern 48322fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor = getDerived().TransformType(TLB, TL.getPatternLoc()); 48332fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (Pattern.isNull()) 48342fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return QualType(); 48352fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 48362fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor QualType Result = TL.getType(); 48372fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (getDerived().AlwaysRebuild() || 48382fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor Pattern != TL.getPatternLoc().getType()) { 48392fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor Result = getDerived().RebuildPackExpansionType(Pattern, 48402fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor TL.getPatternLoc().getSourceRange(), 4841cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor TL.getEllipsisLoc(), 4842cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor TL.getTypePtr()->getNumExpansions()); 48432fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor if (Result.isNull()) 48442fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return QualType(); 48452fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor } 48462fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 48472fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 48482fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor NewT.setEllipsisLoc(TL.getEllipsisLoc()); 48492fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor return Result; 48507536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 48517536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 48527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregortemplate<typename Derived> 4853a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4854a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 485543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCInterfaceTypeLoc TL) { 4856ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // ObjCInterfaceType is never dependent. 4857c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4858c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return TL.getType(); 4859c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 4860c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 4861c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived> 4862c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType 4863c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 486443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCObjectTypeLoc TL) { 4865c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall // ObjCObjectType is never dependent. 4866c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4867ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return TL.getType(); 4868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 48691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 487343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ObjCObjectPointerTypeLoc TL) { 4874ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor // ObjCObjectPointerType is never dependent. 4875c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall TLB.pushFullCopy(TL); 4876ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor return TL.getType(); 487724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 487824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 4879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 488043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 488143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 488243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 488360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 48841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 48853fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 488643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 488743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 488843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 488960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 489043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 489143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 489243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 489343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 489443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 489560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 48961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 489743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 48987114cbab7eb6e8b714eb22f014327daf2c741c08John McCall bool SubStmtInvalid = false; 489943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 4900ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> Statements(getSema()); 490143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 490243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 490360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Result = getDerived().TransformStmt(*B); 49047114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (Result.isInvalid()) { 49057114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // Immediately fail if this was a DeclStmt, since it's very 49067114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // likely that this will cause problems for future statements. 49077114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (isa<DeclStmt>(*B)) 49087114cbab7eb6e8b714eb22f014327daf2c741c08John McCall return StmtError(); 49097114cbab7eb6e8b714eb22f014327daf2c741c08John McCall 49107114cbab7eb6e8b714eb22f014327daf2c741c08John McCall // Otherwise, just keep processing substatements and fail later. 49117114cbab7eb6e8b714eb22f014327daf2c741c08John McCall SubStmtInvalid = true; 49127114cbab7eb6e8b714eb22f014327daf2c741c08John McCall continue; 49137114cbab7eb6e8b714eb22f014327daf2c741c08John McCall } 49141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 491543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 491643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 491743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 49181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49197114cbab7eb6e8b714eb22f014327daf2c741c08John McCall if (SubStmtInvalid) 49207114cbab7eb6e8b714eb22f014327daf2c741c08John McCall return StmtError(); 49217114cbab7eb6e8b714eb22f014327daf2c741c08John McCall 492243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 492343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 49243fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 492543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 492643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 492743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 492843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 492943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 493043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 49311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 493243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 493360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 493560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS, RHS; 4936264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 4937264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 4938f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 49391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4940264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 4941264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 4942264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 4943f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4945264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 4946264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 4947264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 4948f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 4949264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 49501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 495143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 495243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 495343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 495460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 49559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), 495643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 49579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get(), 495843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 495943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 4960f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 496243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 496360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 496443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4965f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 496743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 49689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 496943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 497043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 497143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 497260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 497443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 497560d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 497643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4977f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 497943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 498043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 49819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubStmt.get()); 498243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 49831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 498443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 498560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 49861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 498760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 498843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 4989f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 49901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 499157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 499257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner S->getDecl()); 499357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 499457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return StmtError(); 499557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 499657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 499743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 4998ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner return getDerived().RebuildLabelStmt(S->getIdentLoc(), 499957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD), SourceLocation(), 500057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner SubStmt.get()); 500143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 50021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 500343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 500460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 50051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 500643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 500760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 50088cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 50098cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 5010c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 50118cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 5012aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 5013aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 5014aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 50158cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 5016f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 501799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 50188cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 5019c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 502099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 5021f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5022eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 5023eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor // Convert the condition to a boolean value. 5024afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 50258491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(), 50268491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 5027afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 5028f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5029eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 50309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE.get(); 5031afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 503299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 5033c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 50349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 50359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5036f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5037eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 503843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 503960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Then = getDerived().TransformStmt(S->getThen()); 504043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 5041f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 50421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 504343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 504460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Else = getDerived().TransformStmt(S->getElse()); 504543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 5046f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 50471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 504843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 50499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 505099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 505143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 505243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 50533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 50541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5055eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 505644aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis Then.get(), 50579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall S->getElseLoc(), Else.get()); 505843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 505943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 506043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 506160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 50621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 506343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 506460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 5065d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor VarDecl *ConditionVar = 0; 5066d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (S->getConditionVariable()) { 5067c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 5068d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor = cast_or_null<VarDecl>( 5069aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 5070aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 5071aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 5072d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor if (!ConditionVar) 5073f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 507499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 5075d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 5076c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 507799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 5078f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 507999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 508143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 508260d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Switch 50839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(), 5084586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor ConditionVar); 508543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 5086f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 50871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 508843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 508960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 509043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 5091f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 50921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 509343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 50949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 50959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 509643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 509843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 509960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 51001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 510143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 510260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 51035656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor VarDecl *ConditionVar = 0; 51045656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (S->getConditionVariable()) { 5105c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 51065656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor = cast_or_null<VarDecl>( 5107aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 5108aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 5109aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 51105656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor if (!ConditionVar) 5111f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 511299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 51135656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 5114c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 511599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 5116f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5117afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 5118afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 5119afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor // Convert the condition to a boolean value. 51208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(), 51218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 5122afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 5123f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 51249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE; 5125afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 512699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 51271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 51299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5130f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5131eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 513243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 513360d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 513443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 5135f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 51361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 513743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 51389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 513999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor ConditionVar == S->getConditionVariable() && 514043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 51419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return Owned(S); 51421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5143eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, 51449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall ConditionVar, Body.get()); 514543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 51461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 514743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 514860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 514943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 515043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 515160d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 515243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 5153f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 51541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5155eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor // Transform the condition 515660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(S->getCond()); 5157eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor if (Cond.isInvalid()) 5158f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5159eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 516043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 516143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 516243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 51633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 51641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 51669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall /*FIXME:*/S->getWhileLoc(), Cond.get(), 516743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 516843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 517043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 517160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 51721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 517343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 517460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Init = getDerived().TransformStmt(S->getInit()); 517543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 5176f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 51771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 517843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 517960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond; 518099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor VarDecl *ConditionVar = 0; 518199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (S->getConditionVariable()) { 5182c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ConditionVar 518399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor = cast_or_null<VarDecl>( 5184aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor getDerived().TransformDefinition( 5185aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable()->getLocation(), 5186aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor S->getConditionVariable())); 518799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (!ConditionVar) 5188f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 518999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } else { 519099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 5191c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 519299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor if (Cond.isInvalid()) 5193f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5194afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 5195afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (S->getCond()) { 5196afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor // Convert the condition to a boolean value. 51978491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(), 51988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Cond.get()); 5199afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor if (CondE.isInvalid()) 5200f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5201afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor 52029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond = CondE.get(); 5203afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor } 520499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor } 52051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 52079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5208f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5209eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 521043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 521160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Inc = getDerived().TransformExpr(S->getInc()); 521243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 5213f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 52141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get())); 52169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (S->getInc() && !FullInc.get()) 5217f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5218eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor 521943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 522060d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 522143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 5222f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 52231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 522443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 522543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 52269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullCond.get() == S->getCond() && 522743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 522843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 52293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 52301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 523143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 52329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init.get(), FullCond, ConditionVar, 52339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall FullInc, S->getRParenLoc(), Body.get()); 523443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 523543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 523643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 523760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 52381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 523957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 524057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner S->getLabel()); 524157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 524257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return StmtError(); 524357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 524443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 52451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 524657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD)); 524743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 524843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 524943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 525060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 52511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 525260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Target = getDerived().TransformExpr(S->getTarget()); 525343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 5254f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 52551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 525643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 525743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 52583fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 525943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 526043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 52619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Target.get()); 526243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 526343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 526443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 526560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 52661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 52673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 526843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 52691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 527043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 527160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 52721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 52733fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 527443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 52751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 527643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 527760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 52781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 527960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(S->getRetValue()); 528043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 5281f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 528243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 52831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 528443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 52859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 528643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 52871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 528843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 528960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 52901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 529143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 529243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 529343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 529443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 5295aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), 5296aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor *D); 529743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 5298f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 52991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 530043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 530143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 53021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 530343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 530443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 53051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 530643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 53073fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 53081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 531043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 531143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 53121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 531343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 531460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 531543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 5316c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5317ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Constraints(getSema()); 5318ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Exprs(getSema()); 5319ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson llvm::SmallVector<IdentifierInfo *, 4> Names; 5320a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson 532160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult AsmString; 5322ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Clobbers(getSema()); 5323703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5324703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson bool ExprsChanged = false; 5325c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5326703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the outputs. 5327703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 5328ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getOutputIdentifier(I)); 5329c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5330703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 53313fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Constraints.push_back(S->getOutputConstraintLiteral(I)); 5332c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5333703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the output expr. 5334703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *OutputExpr = S->getOutputExpr(I); 533560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(OutputExpr); 5336703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 5337f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5338c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5339703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != OutputExpr; 5340c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 53419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Exprs.push_back(Result.get()); 5342703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 5343c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5344703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the inputs. 5345703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 5346ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson Names.push_back(S->getInputIdentifier(I)); 5347c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5348703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the constraint literal. 53493fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Constraints.push_back(S->getInputConstraintLiteral(I)); 5350c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5351703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Transform the input expr. 5352703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson Expr *InputExpr = S->getInputExpr(I); 535360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = getDerived().TransformExpr(InputExpr); 5354703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (Result.isInvalid()) 5355f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5356c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5357703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson ExprsChanged |= Result.get() != InputExpr; 5358c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 53599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Exprs.push_back(Result.get()); 5360703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson } 5361c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5362703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson if (!getDerived().AlwaysRebuild() && !ExprsChanged) 53633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5364703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5365703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // Go through the clobbers. 5366703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 53673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall Clobbers.push_back(S->getClobber(I)); 5368703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5369703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson // No need to transform the asm string literal. 5370703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson AsmString = SemaRef.Owned(S->getAsmString()); 5371703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson 5372703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson return getDerived().RebuildAsmStmt(S->getAsmLoc(), 5373703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isSimple(), 5374703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isVolatile(), 5375703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumOutputs(), 5376703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getNumInputs(), 5377a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson Names.data(), 5378703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Constraints), 5379703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Exprs), 53809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall AsmString.get(), 5381703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson move_arg(Clobbers), 5382703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->getRParenLoc(), 5383703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson S->isMSAsm()); 538443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 538543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 538643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 538743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 538860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 53891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 53904dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the body of the @try. 539160d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 53924dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (TryBody.isInvalid()) 5393f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5394c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 53958f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor // Transform the @catch statements (if present). 53968f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor bool AnyCatchChanged = false; 5397ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> CatchStmts(SemaRef); 53988f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 539960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 54004dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Catch.isInvalid()) 5401f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 54028f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor if (Catch.get() != S->getCatchStmt(I)) 54038f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor AnyCatchChanged = true; 54048f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor CatchStmts.push_back(Catch.release()); 54054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 5406c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the @finally statement (if present). 540860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Finally; 54094dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (S->getFinallyStmt()) { 54104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Finally = getDerived().TransformStmt(S->getFinallyStmt()); 54114dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Finally.isInvalid()) 5412f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 54134dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor } 54144dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 54154dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // If nothing changed, just retain this statement. 54164dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (!getDerived().AlwaysRebuild() && 54174dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor TryBody.get() == S->getTryBody() && 54188f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor !AnyCatchChanged && 54194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Finally.get() == S->getFinallyStmt()) 54203fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5421c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54224dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Build a new statement. 54239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 54249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall move_arg(CatchStmts), Finally.get()); 542543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 54261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 542743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 542860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 54291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 5430be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor // Transform the @catch parameter, if there is one. 5431be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor VarDecl *Var = 0; 5432be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (VarDecl *FromVar = S->getCatchParamDecl()) { 5433be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TypeSourceInfo *TSInfo = 0; 5434be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (FromVar->getTypeSourceInfo()) { 5435be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 5436be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (!TSInfo) 5437f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5438be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5439c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5440be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor QualType T; 5441be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (TSInfo) 5442be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor T = TSInfo->getType(); 5443be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor else { 5444be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor T = getDerived().TransformType(FromVar->getType()); 5445be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (T.isNull()) 5446f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5447be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5448c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5449be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 5450be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (!Var) 5451f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5452be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor } 5453c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 545460d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 5455be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor if (Body.isInvalid()) 5456f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5457c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5458c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 5459be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor S->getRParenLoc(), 54609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Var, Body.get()); 546143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 54621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 546343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 546460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 54651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 54664dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Transform the body. 546760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 54684dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (Body.isInvalid()) 5469f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5470c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54714dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // If nothing changed, just retain this statement. 54724dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor if (!getDerived().AlwaysRebuild() && 54734dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor Body.get() == S->getFinallyBody()) 54743fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 54754dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor 54764dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor // Build a new statement. 54774dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 54789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 547943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 54801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 548143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 548260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 54831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 548460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Operand; 5485d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (S->getThrowExpr()) { 5486d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor Operand = getDerived().TransformExpr(S->getThrowExpr()); 5487d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (Operand.isInvalid()) 5488f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5489d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor } 5490c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5491d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor if (!getDerived().AlwaysRebuild() && 5492d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor Operand.get() == S->getThrowExpr()) 54933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return getSema().Owned(S); 5494c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 54959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 549643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 54971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 549843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 549960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 550043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 55011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 55028fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Transform the object we are locking. 550360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 55048fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (Object.isInvalid()) 5505f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5506c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55078fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Transform the body. 550860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 55098fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (Body.isInvalid()) 5510f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5511c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 55128fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // If nothing change, just retain the current statement. 55138fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor if (!getDerived().AlwaysRebuild() && 55148fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor Object.get() == S->getSynchExpr() && 55158fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor Body.get() == S->getSynchBody()) 55163fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 55178fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor 55188fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor // Build a new statement. 55198fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 55209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Object.get(), Body.get()); 552143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 552243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 552343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 552460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 552543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 55261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 5527c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the element statement. 552860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Element = getDerived().TransformStmt(S->getElement()); 5529c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Element.isInvalid()) 5530f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5531c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5532c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the collection expression. 553360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 5534c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Collection.isInvalid()) 5535f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5536c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5537c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Transform the body. 553860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Body = getDerived().TransformStmt(S->getBody()); 5539c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (Body.isInvalid()) 5540f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 5541c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5542c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // If nothing changed, just retain this statement. 5543c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor if (!getDerived().AlwaysRebuild() && 5544c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Element.get() == S->getElement() && 5545c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Collection.get() == S->getCollection() && 5546c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor Body.get() == S->getBody()) 55473fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 5548c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5549c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor // Build a new statement. 5550c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 5551c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor /*FIXME:*/S->getForLoc(), 55529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Element.get(), 55539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Collection.get(), 5554c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor S->getRParenLoc(), 55559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Body.get()); 555643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 555743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 555843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 555943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 556060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 556143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 556243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 556343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 556443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 556543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 556683cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor TypeSourceInfo *T = getDerived().TransformType( 556783cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor ExceptionDecl->getTypeSourceInfo()); 556883cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor if (!T) 5569f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 557183cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T, 557243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 557383cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor ExceptionDecl->getLocation()); 5574ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor if (!Var || Var->isInvalidDecl()) 5575f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 557643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 55771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 557843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 557960d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 5580ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor if (Handler.isInvalid()) 5581f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 55821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 558343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 558443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 558543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 55863fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 558743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 558843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 558943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 55909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Handler.get()); 559143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 55921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 559343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 559460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult 559543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 559643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 559760d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult TryBlock 559843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 559943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 5600f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 56011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 560243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 560343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 5604ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Stmt*> Handlers(SemaRef); 560543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 560660d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult Handler 560743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 560843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 5609f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return StmtError(); 56101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 561143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 561243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 561343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 56141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 561543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 561643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 561743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 56183fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(S); 561943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 56209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 56211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 562243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 56231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 562443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 5625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 5626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 56271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 562860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5629454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 56303fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 56311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 56321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 563460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5635454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 563640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc; 563740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (E->getQualifierLoc()) { 563840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc 563940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 564040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (!QualifierLoc) 5641f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5642a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 5643dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 5644dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *ND 56457c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 56467c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getDecl())); 5647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 5648f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 56491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5650ec8045d3f0375302eadaa63deb373bacaf25a569John McCall DeclarationNameInfo NameInfo = E->getNameInfo(); 5651ec8045d3f0375302eadaa63deb373bacaf25a569John McCall if (NameInfo.getName()) { 5652ec8045d3f0375302eadaa63deb373bacaf25a569John McCall NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 5653ec8045d3f0375302eadaa63deb373bacaf25a569John McCall if (!NameInfo.getName()) 5654f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5655ec8045d3f0375302eadaa63deb373bacaf25a569John McCall } 56562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 56572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!getDerived().AlwaysRebuild() && 565840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc == E->getQualifierLoc() && 5659a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 56602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getDecl()->getDeclName() && 5661096832c5ed5b9106fa177ebc148489760c3bc496John McCall !E->hasExplicitTemplateArgs()) { 56621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5663dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // Mark it referenced in the new context regardless. 5664dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall // FIXME: this is a bit instantiation-specific. 5665dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 5666a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 56673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5668a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 5669dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 5670dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 5671096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (E->hasExplicitTemplateArgs()) { 5672dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TemplateArgs = &TransArgs; 5673dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 5674dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 5675fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 5676fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 5677fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 5678fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 5679dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall } 5680dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall 568140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 568240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor TemplateArgs); 5683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 56841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 568660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5687454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 56883fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 56901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 569260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5693454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 56943fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 56961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 569860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5699454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 57003fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 570460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5705454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 57063fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 571060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5711454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 57123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 571660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5717454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 571860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 5719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5720f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 57233fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 57241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 5726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 5727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 57291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 573060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5731454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 573260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 5733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5734f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 57351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 57373fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 57381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 5740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 57419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get()); 5742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 57431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 574560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 57468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 57478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Transform the type. 57488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 57498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!Type) 5750f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5751c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 57528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Transform all of the components into components similar to what the 57538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // parser uses. 5754c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // FIXME: It would be slightly more efficient in the non-dependent case to 5755c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // just map FieldDecls, rather than requiring the rebuilder to look for 5756c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // the fields again. However, __builtin_offsetof is rare enough in 57578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // template code that we don't care. 57588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool ExprChanged = false; 5759f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall typedef Sema::OffsetOfComponent Component; 57608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor typedef OffsetOfExpr::OffsetOfNode Node; 57618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor llvm::SmallVector<Component, 4> Components; 57628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 57638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const Node &ON = E->getComponent(I); 57648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Component Comp; 576572be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor Comp.isBrackets = true; 57668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.LocStart = ON.getRange().getBegin(); 57678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.LocEnd = ON.getRange().getEnd(); 57688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor switch (ON.getKind()) { 57698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Array: { 57708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 577160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Index = getDerived().TransformExpr(FromIndex); 57728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (Index.isInvalid()) 5773f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5774c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 57758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor ExprChanged = ExprChanged || Index.get() != FromIndex; 57768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.isBrackets = true; 57779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Comp.U.E = Index.get(); 57788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 57798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5780c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 57818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Field: 57828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor case Node::Identifier: 57838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.isBrackets = false; 57848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Comp.U.IdentInfo = ON.getFieldName(); 578529d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor if (!Comp.U.IdentInfo) 578629d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor continue; 5787c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 57888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor break; 5789c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5790cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor case Node::Base: 5791cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Will be recomputed during the rebuild. 5792cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor continue; 57938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5794c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 57958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Components.push_back(Comp); 57968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 5797c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 57988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // If nothing changed, retain the existing expression. 57998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!getDerived().AlwaysRebuild() && 58008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Type == E->getTypeSourceInfo() && 58018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor !ExprChanged) 58023fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5803c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 58048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Build a new offsetof expression. 58058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 58068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Components.data(), Components.size(), 58078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor E->getRParenLoc()); 58087cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall} 58097cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall 58107cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCalltemplate<typename Derived> 58117cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallExprResult 58127cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallTreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 58137cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall assert(getDerived().AlreadyTransformed(E->getType()) && 58147cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall "opaque value expression requires transformation"); 58157cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall return SemaRef.Owned(E); 58168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 58178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 58188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived> 581960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5820454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 5821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 5822a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 58235557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 5824a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 58255ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 5826f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58285ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 58293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 58301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58315ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 58321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 5833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 5834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 58351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 583660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr; 58371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 5838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 5839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 5840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 5841f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 58421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 5844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5845f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 58483fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 5849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 58501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildSizeOfAlignOf(SubExpr.get(), E->getOperatorLoc(), 5852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 5853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 5854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 585760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5858454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 585960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 5860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 5861f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 586360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 5864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 5865f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 58661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 5870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 58713fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 58721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildArraySubscriptExpr(LHS.get(), 5874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 58759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get(), 5876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 5877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 58781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 588060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5881454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 5882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 588360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 5884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 5885f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 5886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 5888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 5889ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 5890aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 5891aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgChanged)) 5892aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 5893aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 5894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 5896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 58973fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 58981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 59001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 5901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 59029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 5903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 5904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 590860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5909454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 591060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 5911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 5912f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 591440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc; 591583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 591640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc 591740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 591840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor 591940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (!QualifierLoc) 5920f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 592183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 59221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5923f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *Member 59247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 59257c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getMemberDecl())); 5926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 5927f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59296bb8017bb9e828d118e15e59d71c66bba323c364John McCall NamedDecl *FoundDecl = E->getFoundDecl(); 59306bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (FoundDecl == E->getMemberDecl()) { 59316bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl = Member; 59326bb8017bb9e828d118e15e59d71c66bba323c364John McCall } else { 59336bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl = cast_or_null<NamedDecl>( 59346bb8017bb9e828d118e15e59d71c66bba323c364John McCall getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 59356bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!FoundDecl) 5936f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59376bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 59386bb8017bb9e828d118e15e59d71c66bba323c364John McCall 5939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 594140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc == E->getQualifierLoc() && 59428a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member == E->getMemberDecl() && 59436bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl == E->getFoundDecl() && 5944096832c5ed5b9106fa177ebc148489760c3bc496John McCall !E->hasExplicitTemplateArgs()) { 5945c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 59461f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // Mark it referenced in the new context regardless. 59471f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson // FIXME: this is a bit instantiation-specific. 59481f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member); 59493fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 59501f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson } 5951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5952d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 5953096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (E->hasExplicitTemplateArgs()) { 5954d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 5955d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 5956fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 5957fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 5958fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 5959fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 59608a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 5961c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 5962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 5963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 5964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 5965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 5966c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 5967c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 5968c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 5969c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 5970c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 5971c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 59729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 5973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 597440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor QualifierLoc, 59752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara E->getMemberNameInfo(), 59768a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 59776bb8017bb9e828d118e15e59d71c66bba323c364John McCall FoundDecl, 5978096832c5ed5b9106fa177ebc148489760c3bc496John McCall (E->hasExplicitTemplateArgs() 5979d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 5980c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope); 5981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 59821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 598460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 5985454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 598660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 5987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 5988f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 599060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 5991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 5992f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 59931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 5996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 59973fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 59981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 60009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), RHS.get()); 6001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 60031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 600460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 6006454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CompoundAssignOperator *E) { 6007454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformBinaryOperator(E); 6008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 601156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallExprResult TreeTransform<Derived>:: 601256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallTransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 601356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // Just rebuild the common and RHS expressions and see whether we 601456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // get any changes. 601556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 601656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 601756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (commonExpr.isInvalid()) 601856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return ExprError(); 601956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 602056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 602156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (rhs.isInvalid()) 602256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return ExprError(); 602356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 602456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (!getDerived().AlwaysRebuild() && 602556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall commonExpr.get() == e->getCommon() && 602656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs.get() == e->getFalseExpr()) 602756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return SemaRef.Owned(e); 602856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 602956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return getDerived().RebuildConditionalOperator(commonExpr.take(), 603056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall e->getQuestionLoc(), 603156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 0, 603256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall e->getColonLoc(), 603356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs.get()); 603456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 603556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 603656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCalltemplate<typename Derived> 603760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6038454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 603960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(E->getCond()); 6040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 6041f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 604360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 6045f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 604760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 6049f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 6053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 6054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 60553fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 60561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildConditionalOperator(Cond.get(), 605847e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 60599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall LHS.get(), 606047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 60619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall RHS.get()); 6062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 606560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 6067a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // Implicit casts are eliminated during transformation, since they 6068a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor // will be recomputed by semantic analysis after transformation. 60696eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return getDerived().TransformExpr(E->getSubExprAsWritten()); 6070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 607360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6074454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 6075ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6076ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 6077ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 6078ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor 607960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 60806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 6081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6082f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 60831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6085ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 6086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 60873fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 60881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60899d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 6090ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type, 6091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 60929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get()); 6093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 60941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 609660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6097454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 609842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *OldT = E->getTypeSourceInfo(); 609942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *NewT = getDerived().TransformType(OldT); 610042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall if (!NewT) 6101f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 610360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 6104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 6105f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 610842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall OldT == NewT && 6109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 61103fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 61121d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // Note: the expression type doesn't necessarily match the 61131d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // type-as-written, but that's okay, because it should always be 61141d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall // derivable from the initializer. 61151d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall 611642f56b50062cd3b3c6b23fdb9053578ae9145664John McCall return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 6117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 61189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Init.get()); 6119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 61201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 612260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6123454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 612460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 6125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 6126f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 61303fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 61311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 61331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 6134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 61359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 6136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 6137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 6138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 61391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 614160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6142454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 6143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 61441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6145ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> Inits(SemaRef); 6146aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 6147aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Inits, &InitChanged)) 6148aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6149aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 6150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 61513fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 61521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 6154e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 6155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 61561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 615860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6159454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 6160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 61611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 616243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 616360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Init = getDerived().TransformExpr(E->getInit()); 6164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 6165f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 616743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 6168ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef); 6169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 6170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 6171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 6172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 6173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 6174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 6175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 6176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 6177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 6178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 61791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 618160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 6182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 6183f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 61851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 6186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 61871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 6189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 6190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 6191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 61921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 619460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Start 6195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 6196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 6197f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 61981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 619960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 6200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 6201f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 62031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 6204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 6205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 6206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 62071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 6209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 62101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 6212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 6213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 62141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 6217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 62183fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 6221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 62229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall E->usesGNUSyntax(), Init.get()); 6223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 622660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 6228454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall ImplicitValueInitExpr *E) { 62295557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 6230c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 62315557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 62325557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 6233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 6234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 6235f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 62393fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 6242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 624560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6246454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 62479bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 62489bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor if (!TInfo) 6249f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 625160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 6252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6253f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 62541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 62562cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TInfo == E->getWrittenTypeInfo() && 6257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 62583fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 62591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 62609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 62612cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TInfo, E->getRParenLoc()); 6262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 626560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6266454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 6267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6268ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*, 4> Inits(SemaRef); 6269aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 6270aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 6271aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6272aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 6273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 6274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 6275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 6279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 6280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 6281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 6282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 6283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 628460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6285454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 628657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 628757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner E->getLabel()); 628857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (!LD) 628957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return ExprError(); 629057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 6291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 629257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner cast<LabelDecl>(LD)); 6293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 62941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 62951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 629660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6297454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 629860d7b3a319d84d688752be3870615ac0f111fb16John McCall StmtResult SubStmt 6299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 6300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 6301f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 63021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 63053fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 63061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 63089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubStmt.get(), 6309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 631360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6314454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 631560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Cond = getDerived().TransformExpr(E->getCond()); 6316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 6317f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 63181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 631960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 6321f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 63221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 632360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 6325f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 63261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 6329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 6330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 63313fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 63321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 63349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Cond.get(), LHS.get(), RHS.get(), 6335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 63371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 633960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6340454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 63413fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 634560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6346454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 6347668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor switch (E->getOperator()) { 6348668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_New: 6349668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Delete: 6350668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_New: 6351668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Array_Delete: 6352668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 6353f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6354c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6355668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Call: { 6356668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // This is a call to an object's operator(). 6357668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 6358668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6359668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the object itself. 636060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 6361668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor if (Object.isInvalid()) 6362f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6363668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6364668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // FIXME: Poor location information 6365668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor SourceLocation FakeLParenLoc 6366668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 6367668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor static_cast<Expr *>(Object.get())->getLocEnd()); 6368668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6369668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Transform the call arguments. 6370ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 6371aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 6372aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args)) 6373aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 6374668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 63759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 6376668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor move_arg(Args), 6377668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor E->getLocEnd()); 6378668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 6379668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6380668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 6381668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_##Name: 6382668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 6383668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def" 6384668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Subscript: 6385668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor // Handled below. 6386668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor break; 6387668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6388668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_Conditional: 6389668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("conditional operator is not actually overloadable"); 6390f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6391668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 6392668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case OO_None: 6393668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor case NUM_OVERLOADED_OPERATORS: 6394668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor llvm_unreachable("not an overloaded operator?"); 6395f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6396668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor } 6397668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor 639860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 6399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 6400f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 640260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult First = getDerived().TransformExpr(E->getArg(0)); 6403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 6404f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 640660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Second; 6407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 6408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 6409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 6410f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 64121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 6415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 64161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 64173fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 64181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 6420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 64219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Callee.get(), 64229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall First.get(), 64239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second.get()); 6424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 64251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 642760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6428454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 6429454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCallExpr(E); 6430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 64311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 6433e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneExprResult 6434e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneTreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 6435e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform the callee. 6436e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 6437e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (Callee.isInvalid()) 6438e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6439e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6440e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform exec config. 6441e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 6442e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (EC.isInvalid()) 6443e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6444e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6445e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // Transform arguments. 6446e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne bool ArgChanged = false; 6447e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne ASTOwningVector<Expr*> Args(SemaRef); 6448e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6449e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne &ArgChanged)) 6450e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return ExprError(); 6451e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6452e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne if (!getDerived().AlwaysRebuild() && 6453e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne Callee.get() == E->getCallee() && 6454e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne !ArgChanged) 6455e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return SemaRef.Owned(E); 6456e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6457e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne // FIXME: Wrong source location information for the '('. 6458e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne SourceLocation FakeLParenLoc 6459e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne = ((Expr *)Callee.get())->getSourceRange().getBegin(); 6460e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 6461e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne move_arg(Args), 6462e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne E->getRParenLoc(), EC.get()); 6463e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne} 6464e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 6465e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournetemplate<typename Derived> 646660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6467454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 6468ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6469ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 6470ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 6471ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor 647260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 64736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 6474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6475f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 64761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6478ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 6479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 64803fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 64811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 64831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 6484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 6485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 6486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 6487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 6488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 6489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 64901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 6491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 6492ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type, 6493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 6494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 64959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 6497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 64981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 650060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6501454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 6502454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 650660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6507454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 6508454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 651260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 6514454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXReinterpretCastExpr *E) { 6515454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 651960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6520454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 6521454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall return getDerived().TransformCXXNamedCastExpr(E); 6522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 652560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 6527454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXFunctionalCastExpr *E) { 6528ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6529ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!Type) 6530ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return ExprError(); 65311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 653260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr 65336eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor = getDerived().TransformExpr(E->getSubExprAsWritten()); 6534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6535f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6538ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor Type == E->getTypeInfoAsWritten() && 6539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 65403fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 65411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6542ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr(Type, 6543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 65449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 6546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 65471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 654960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6550454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 6551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 655257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *TInfo 655357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor = getDerived().TransformType(E->getTypeOperandSourceInfo()); 655457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor if (!TInfo) 6555f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 655857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TInfo == E->getTypeOperandSourceInfo()) 65593fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 65601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 656157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getType(), 656257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor E->getLocStart(), 656357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TInfo, 6564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 65661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 6568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 6569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 65701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 6571f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::PotentiallyPotentiallyEvaluated); 65721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 657360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 6574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6575f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 65761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 65793fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 65801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 658157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getType(), 658257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor E->getLocStart(), 65839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SubExpr.get(), 6584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 6585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 6586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 6587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 658860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 658901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetTreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 659001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (E->isTypeOperand()) { 659101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TypeSourceInfo *TInfo 659201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet = getDerived().TransformType(E->getTypeOperandSourceInfo()); 659301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!TInfo) 659401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return ExprError(); 659501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 659601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!getDerived().AlwaysRebuild() && 659701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TInfo == E->getTypeOperandSourceInfo()) 65983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 659901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 660001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getDerived().RebuildCXXTypeidExpr(E->getType(), 660101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocStart(), 660201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TInfo, 660301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocEnd()); 660401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 660501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 660601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // We don't know whether the expression is potentially evaluated until 660701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // after we perform semantic analysis, so the expression is potentially 660801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // potentially evaluated. 660901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 661001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 661101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 661201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (SubExpr.isInvalid()) 661301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return ExprError(); 661401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 661501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (!getDerived().AlwaysRebuild() && 661601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SubExpr.get() == E->getExprOperand()) 66173fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 661801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 661901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return getDerived().RebuildCXXUuidofExpr(E->getType(), 662001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocStart(), 662101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SubExpr.get(), 662201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet E->getLocEnd()); 662301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet} 662401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 662501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichettemplate<typename Derived> 662601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetExprResult 6627454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 66283fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 66301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 663260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 6634454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXNullPtrLiteralExpr *E) { 66353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 66371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 663960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6640454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 6641ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor DeclContext *DC = getSema().getFunctionLevelDeclContext(); 6642ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC); 6643ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor QualType T = MD->getThisType(getSema().Context); 66441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6645ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor if (!getDerived().AlwaysRebuild() && T == E->getType()) 66463fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 66471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6648828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 6649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 66501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 665260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6653454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 665460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 6655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 6656f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 66571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 66603fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 6661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 66629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get()); 6663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 66641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 666660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6667454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 66681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 66697c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 66707c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getParam())); 6671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 6672f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 66731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 667453cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth if (!getDerived().AlwaysRebuild() && 6675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 66763fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 66771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6678036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 6679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 66801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 668260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6683ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr( 6684ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXScalarValueInitExpr *E) { 6685ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 6686ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 6687f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6688ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 6689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 6690ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo()) 66913fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 66921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6693ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXScalarValueInitExpr(T, 6694ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /*FIXME:*/T->getTypeLoc().getEndLoc(), 6695ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor E->getRParenLoc()); 6696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 66971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 669960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6700454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 6701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 67021bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *AllocTypeInfo 67031bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor = getDerived().TransformType(E->getAllocatedTypeSourceInfo()); 67041bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor if (!AllocTypeInfo) 6705f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 670860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 6709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 6710f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 6713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 6714ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> PlacementArgs(SemaRef); 6715aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getPlacementArgs(), 6716aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor E->getNumPlacementArgs(), true, 6717aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor PlacementArgs, &ArgumentChanged)) 6718aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 67191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 672043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 6721ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> ConstructorArgs(SemaRef); 6722aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getConstructorArgs(), E->getNumConstructorArgs(), true, 6723aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor ConstructorArgs, &ArgumentChanged)) 6724aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 67251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform constructor, new operator, and delete operator. 67271af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor CXXConstructorDecl *Constructor = 0; 67281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getConstructor()) { 67291af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor = cast_or_null<CXXConstructorDecl>( 67307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 67317c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 67321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!Constructor) 6733f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67341af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 67351af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 67361af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorNew = 0; 67371af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorNew()) { 67381af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew = cast_or_null<FunctionDecl>( 67397c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 67407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorNew())); 67411af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorNew) 6742f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67431af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 67441af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor 67451af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 67461af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 67471af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 67487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 67497c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 67501af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 6751f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 67521af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 6753c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 67551bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 6756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 67571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Constructor == E->getConstructor() && 67581af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorNew == E->getOperatorNew() && 67591af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete() && 67601af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor !ArgumentChanged) { 67611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 67621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 67631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (Constructor) 67641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 67651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorNew) 67661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew); 67671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 67681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 67693fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 67701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 67711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67721bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor QualType AllocType = AllocTypeInfo->getType(); 67735b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArraySize.get()) { 67745b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // If no array size was specified, but the new expression was 67755b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with an array type (e.g., "new T" where T is 67765b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // instantiated with "int[4]"), extract the outer bound from the 67775b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // array type as our array size. We do this with constant and 67785b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // dependently-sized array types. 67795b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 67805b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (!ArrayT) { 67815b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor // Do nothing 67825b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const ConstantArrayType *ConsArrayT 67835b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<ConstantArrayType>(ArrayT)) { 6784c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt ArraySize 67859996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context, 67869996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis ConsArrayT->getSize(), 67879996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis SemaRef.Context.getSizeType(), 67889996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis /*FIXME:*/E->getLocStart())); 67895b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = ConsArrayT->getElementType(); 67905b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } else if (const DependentSizedArrayType *DepArrayT 67915b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor = dyn_cast<DependentSizedArrayType>(ArrayT)) { 67925b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor if (DepArrayT->getSizeExpr()) { 67933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()); 67945b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor AllocType = DepArrayT->getElementType(); 67955b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 67965b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 67975b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor } 67981bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor 6799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 6800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 6801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 6802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 6803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 68044bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor E->getTypeIdParens(), 6805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 68061bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor AllocTypeInfo, 68079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall ArraySize.get(), 6808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 6809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 68101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 6811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 681460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6815454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 681660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 6817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 6818f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68201af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Transform the delete operator, if known. 68211af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor FunctionDecl *OperatorDelete = 0; 68221af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (E->getOperatorDelete()) { 68231af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete = cast_or_null<FunctionDecl>( 68247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 68257c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getOperatorDelete())); 68261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (!OperatorDelete) 6827f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 6829c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 68311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor Operand.get() == E->getArgument() && 68321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor OperatorDelete == E->getOperatorDelete()) { 68331af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark any declarations we need as referenced. 68341af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: instantiation-specific. 68351af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor if (OperatorDelete) 68361af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete); 68375833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor 68385833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor if (!E->getArgument()->isTypeDependent()) { 68395833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor QualType Destroyed = SemaRef.Context.getBaseElementType( 68405833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor E->getDestroyedType()); 68415833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 68425833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 68435833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), 68445833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor SemaRef.LookupDestructor(Record)); 68455833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor } 68465833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor } 68475833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor 68483fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 68491af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor } 68501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 6852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 6853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 68549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Operand.get()); 6855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 68561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 685860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 6860454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXPseudoDestructorExpr *E) { 686160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 6862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 6863f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 68641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6865b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ObjectTypePtr; 6866a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor bool MayBePseudoDestructor = false; 68679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 6868a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getOperatorLoc(), 6869a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->isArrow()? tok::arrow : tok::period, 6870a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor ObjectTypePtr, 6871a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor MayBePseudoDestructor); 6872a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (Base.isInvalid()) 6873f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6874c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6875b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall QualType ObjectType = ObjectTypePtr.get(); 6876f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 6877f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor if (QualifierLoc) { 6878f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor QualifierLoc 6879f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 6880f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor if (!QualifierLoc) 688143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return ExprError(); 688243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall } 6883f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor CXXScopeSpec SS; 6884f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SS.Adopt(QualifierLoc); 68851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6886a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed; 6887a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (E->getDestroyedTypeInfo()) { 6888a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedTypeInfo 688943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 6890b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor ObjectType, 0, SS); 6891a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!DestroyedTypeInfo) 6892f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6893a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = DestroyedTypeInfo; 6894a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else if (ObjectType->isDependentType()) { 6895a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // We aren't likely to be able to resolve the identifier down to a type 6896a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // now anyway, so just retain the identifier. 6897a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 6898a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 6899a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } else { 6900a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor // Look for a destructor known with the given name. 6901b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 6902a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor *E->getDestroyedTypeIdentifier(), 6903a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc(), 6904a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /*Scope=*/0, 6905a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SS, ObjectTypePtr, 6906a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor false); 6907a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (!T) 6908f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6909c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6910a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed 6911a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 6912a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedTypeLoc()); 6913a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 691426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 691526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeTypeInfo = 0; 691626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (E->getScopeTypeInfo()) { 691743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo()); 691826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor if (!ScopeTypeInfo) 6919f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6920a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 6921c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 69229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 6923a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 6924a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 6925f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor SS, 692626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor ScopeTypeInfo, 692726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor E->getColonColonLoc(), 6928fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor E->getTildeLoc(), 6929a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed); 6930a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 69311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6932a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 693360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 6934ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 6935454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall UnresolvedLookupExpr *Old) { 6936f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName()); 6937f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6938f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 6939f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Sema::LookupOrdinaryName); 6940f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6941f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Transform all the decls. 6942f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 6943f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = Old->decls_end(); I != E; ++I) { 69447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 69457c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getNameLoc(), 69467c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 69479f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 69489f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 69499f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 69509f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 69519f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 69529f54ad4381370c6b771424b53d219e661d6d6706John McCall else 6953f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 69549f54ad4381370c6b771424b53d219e661d6d6706John McCall } 6955f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6956f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Expand using declarations. 6957f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (isa<UsingDecl>(InstD)) { 6958f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 6959f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 6960f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall E = UD->shadow_end(); I != E; ++I) 6961f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(*I); 6962f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall continue; 6963f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6964f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6965f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.addDecl(InstD); 6966f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6967f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6968f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Resolve a kind, but don't do any further analysis. If it's 6969f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // ambiguous, the callee needs to deal with it. 6970f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall R.resolveKind(); 6971f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6972f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Rebuild the nested-name qualifier, if present. 6973f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall CXXScopeSpec SS; 69744c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (Old->getQualifierLoc()) { 69754c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc 69764c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 69774c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (!QualifierLoc) 6978f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6979c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 69804c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor SS.Adopt(QualifierLoc); 6981c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt } 6982c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6983c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor if (Old->getNamingClass()) { 698466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor CXXRecordDecl *NamingClass 698566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 698666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNameLoc(), 698766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNamingClass())); 698866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor if (!NamingClass) 6989f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 6990c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 699166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor R.setNamingClass(NamingClass); 6992f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 6993f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6994f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have no template arguments, it's a normal declaration name. 6995f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!Old->hasExplicitTemplateArgs()) 6996f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 6997f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 6998f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // If we have template arguments, rebuild them, then rebuild the 6999f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // templateid expression. 7000f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 7001fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 7002fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor Old->getNumTemplateArgs(), 7003fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 7004fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 7005f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 7006f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(), 7007f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TransArgs); 7008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 70091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 701160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7012454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 70133d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 70143d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor if (!T) 7015f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 70161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 70183d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor T == E->getQueriedTypeSourceInfo()) 70193fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 70201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 7022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 7023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 7024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 7025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 70261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 702860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 70296ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetTreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 70306ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo()); 70316ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!LhsT) 70326ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return ExprError(); 70336ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 70346ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo()); 70356ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!RhsT) 70366ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return ExprError(); 70376ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 70386ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet if (!getDerived().AlwaysRebuild() && 70396ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo()) 70406ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return SemaRef.Owned(E); 70416ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 70426ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet return getDerived().RebuildBinaryTypeTrait(E->getTrait(), 70436ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet E->getLocStart(), 70446ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet LhsT, RhsT, 70456ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet E->getLocEnd()); 70466ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet} 70476ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 70486ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichettemplate<typename Derived> 70496ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetExprResult 7050865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 70512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DependentScopeDeclRefExpr *E) { 705200cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc 705300cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 705400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor if (!QualifierLoc) 7055f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 70561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 705743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // TODO: If this is a conversion-function-id, verify that the 705843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // destination type name (if present) resolves the same way after 705943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // instantiation as it did in the local scope. 706043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 70612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo 70622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 70632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!NameInfo.getName()) 7064f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 70651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7066f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!E->hasExplicitTemplateArgs()) { 7067f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (!getDerived().AlwaysRebuild() && 706800cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor QualifierLoc == E->getQualifierLoc() && 70692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // Note: it is sufficient to compare the Name component of NameInfo: 70702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // if name has not changed, DNLoc has not changed either. 70712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getDeclName()) 70723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 70731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 707400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 70752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 7076f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /*TemplateArgs*/ 0); 7077f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 7078d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 7079d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 7080fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 7081fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 7082fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 7083fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 7084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 708500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 70862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 7087f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall &TransArgs); 7088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 709160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7092454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 7093321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // CXXConstructExprs are always implicit, so when we have a 7094321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor // 1-argument construction we just transform that argument. 7095321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor if (E->getNumArgs() == 1 || 7096321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) 7097321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor return getDerived().TransformExpr(E->getArg(0)); 7098321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor 7099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 7100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 7102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 7103f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 7106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 71077c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(E->getLocStart(), 71087c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 7109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 7110f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 71111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 7113ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 7114aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 7115aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 7116aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 7117aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 7118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 7119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 7120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 7121c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor !ArgumentChanged) { 71221af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // Mark the constructor as referenced. 71231af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor // FIXME: Instantiation-specific 7124c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 71253fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7126c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor } 71271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 71284411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 71294411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor Constructor, E->isElidable(), 71308c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor move_arg(Args), 71318c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor E->requiresZeroInitialization(), 7132428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth E->getConstructionKind(), 7133428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth E->getParenRange()); 7134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 71351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 7137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 71385132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 71395132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that. 7140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 714160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7142454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 71435132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 7144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 71451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 71464765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// \brief Transform a C++ expression that contains cleanups that should 71474765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// be run after the expression is evaluated. 7148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 71494765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// Since ExprWithCleanups nodes are implicitly generated, we 71505132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that. 7151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 715260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 71534765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallTreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 71545132655e4296b780672e9a96b46a740135073534Douglas Gregor return getDerived().TransformExpr(E->getSubExpr()); 7155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 71561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 715860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 7160ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXTemporaryObjectExpr *E) { 7161ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 7162ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 7163f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 71641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 7166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 7167c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt getDerived().TransformDecl(E->getLocStart(), 71687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor E->getConstructor())); 7169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 7170f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 71711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 7173ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 7174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 7175aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 7176aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 7177aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 71781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 7180ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo() && 7181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 718291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor !ArgumentChanged) { 718391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor // FIXME: Instantiation-specific 7184ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor); 71853fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.MaybeBindToTemporary(E); 718691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor } 7187ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 7188ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(T, 7189ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /*FIXME:*/T->getTypeLoc().getEndLoc(), 7190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 7191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 7192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 71931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 719560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 7197454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall CXXUnresolvedConstructExpr *E) { 7198ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 7199ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (!T) 7200f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 72011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 7203ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 7204aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args.reserve(E->arg_size()); 7205aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 7206aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgumentChanged)) 7207aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 7208aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 7209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 7210ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor T == E->getTypeSourceInfo() && 7211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 72123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 72131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 7215ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(T, 7216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 7217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 7218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 7219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 72201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 722260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7223865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 72242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara CXXDependentScopeMemberExpr *E) { 7225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 722660d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base((Expr*) 0); 7227aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *OldBase; 7228aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 7229aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType ObjectType; 7230aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->isImplicitAccess()) { 7231aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = E->getBase(); 7232aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(OldBase); 7233aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 7234f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 72351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7236aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall // Start the member reference and compute the object's type. 7237b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType ObjectTy; 7238d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor bool MayBePseudoDestructor = false; 72399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 7240aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall E->getOperatorLoc(), 7241a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 7242d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor ObjectTy, 7243d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor MayBePseudoDestructor); 7244aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 7245f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7246aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 7247b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ObjectType = ObjectTy.get(); 7248aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 7249aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 7250aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OldBase = 0; 7251aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(E->getBaseType()); 7252aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 7253aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 72541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 72566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 7257c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 72586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 72597c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor E->getFirstQualifierFoundInScope(), 72607c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor E->getQualifierLoc().getBeginLoc()); 72611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72627c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 7263a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 72647c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc 72657c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 72667c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor ObjectType, 72677c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor FirstQualifierInScope); 72687c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor if (!QualifierLoc) 7269f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7270a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 72711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 727243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // TODO: If this is a conversion-function-id, verify that the 727343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // destination type name (if present) resolves the same way after 727443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall // instantiation as it did in the local scope. 727543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall 72762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo 727743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 72782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (!NameInfo.getName()) 7279f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 72801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7281aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!E->hasExplicitTemplateArgs()) { 72823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 72833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 72843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 7285aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base.get() == OldBase && 7286aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType == E->getBaseType() && 72877c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc == E->getQualifierLoc() && 72882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.getName() == E->getMember() && 72893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 72903fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 72911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 7293aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 72943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 72953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 72967c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc, 7297129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall FirstQualifierInScope, 72982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 7299129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /*TemplateArgs*/ 0); 73003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 73013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 7302d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 7303fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 7304fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor E->getNumTemplateArgs(), 7305fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 7306fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 73071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 7309aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 7310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 7311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 73127c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor QualifierLoc, 73133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 73142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 7315129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall &TransArgs); 7316129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 7317129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7318129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived> 731960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7320454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 7321129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform the base of the expression. 732260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base((Expr*) 0); 7323aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 7324aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Old->isImplicitAccess()) { 7325aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Base = getDerived().TransformExpr(Old->getBase()); 7326aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Base.isInvalid()) 7327f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7328aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = ((Expr*) Base.get())->getType(); 7329aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } else { 7330aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType = getDerived().TransformType(Old->getBaseType()); 7331aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 7332129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 73334c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 73344c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (Old->getQualifierLoc()) { 73354c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor QualifierLoc 73364c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 73374c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor if (!QualifierLoc) 7338f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7339129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7340129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 73412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara LookupResult R(SemaRef, Old->getMemberNameInfo(), 7342129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Sema::LookupOrdinaryName); 7343129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7344129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Transform all the decls. 7345129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 7346129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = Old->decls_end(); I != E; ++I) { 73477c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstD = static_cast<NamedDecl*>( 73487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor getDerived().TransformDecl(Old->getMemberLoc(), 73497c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor *I)); 73509f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!InstD) { 73519f54ad4381370c6b771424b53d219e661d6d6706John McCall // Silently ignore these if a UsingShadowDecl instantiated to nothing. 73529f54ad4381370c6b771424b53d219e661d6d6706John McCall // This can happen because of dependent hiding. 73539f54ad4381370c6b771424b53d219e661d6d6706John McCall if (isa<UsingShadowDecl>(*I)) 73549f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 73559f54ad4381370c6b771424b53d219e661d6d6706John McCall else 7356f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 73579f54ad4381370c6b771424b53d219e661d6d6706John McCall } 7358129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7359129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Expand using declarations. 7360129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (isa<UsingDecl>(InstD)) { 7361129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall UsingDecl *UD = cast<UsingDecl>(InstD); 7362129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 7363129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall E = UD->shadow_end(); I != E; ++I) 7364129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(*I); 7365129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall continue; 7366129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7367129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7368129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.addDecl(InstD); 7369129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7370129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7371129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R.resolveKind(); 7372129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 7373c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor // Determine the naming class. 7374042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth if (Old->getNamingClass()) { 7375c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt CXXRecordDecl *NamingClass 7376c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 737766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getMemberLoc(), 737866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor Old->getNamingClass())); 737966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor if (!NamingClass) 7380f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7381c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 738266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor R.setNamingClass(NamingClass); 7383c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor } 7384c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7385129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TemplateArgumentListInfo TransArgs; 7386129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Old->hasExplicitTemplateArgs()) { 7387129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setLAngleLoc(Old->getLAngleLoc()); 7388129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall TransArgs.setRAngleLoc(Old->getRAngleLoc()); 7389fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 7390fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor Old->getNumTemplateArgs(), 7391fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor TransArgs)) 7392fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor return ExprError(); 7393129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 7394c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall 7395c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // FIXME: to do this check properly, we will need to preserve the 7396c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // first-qualifier-in-scope here, just in case we had a dependent 7397c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // base (and therefore couldn't do the check) and a 7398c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall // nested-name-qualifier (and therefore could do the lookup). 7399c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall NamedDecl *FirstQualifierInScope = 0; 7400c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 74019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 7402aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall BaseType, 7403129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->getOperatorLoc(), 7404129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Old->isArrow(), 74054c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor QualifierLoc, 7406c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall FirstQualifierInScope, 7407129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall R, 7408129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall (Old->hasExplicitTemplateArgs() 7409129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall ? &TransArgs : 0)); 7410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 741360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 74142e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlTreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 74152e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 74162e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl if (SubExpr.isInvalid()) 74172e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return ExprError(); 74182e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 74192e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 74203fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 74212e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 74222e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 74232e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl} 74242e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 74252e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redltemplate<typename Derived> 74262e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlExprResult 7427be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorTreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 74284f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 74294f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor if (Pattern.isInvalid()) 74304f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor return ExprError(); 74314f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 74324f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 74334f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor return SemaRef.Owned(E); 74344f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 743567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 743667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor E->getNumExpansions()); 7437be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor} 7438ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7439ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregortemplate<typename Derived> 7440ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorExprResult 7441ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorTreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 7442ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // If E is not value-dependent, then nothing will change when we transform it. 7443ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // Note: This is an instantiation-centric view. 7444ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor if (!E->isValueDependent()) 7445ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return SemaRef.Owned(E); 7446ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7447ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // Note: None of the implementations of TryExpandParameterPacks can ever 7448ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // produce a diagnostic when given only a single unexpanded parameter pack, 7449ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // so 7450ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 7451ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor bool ShouldExpand = false; 7452d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 7453cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions; 7454ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 7455ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor &Unexpanded, 1, 7456d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor ShouldExpand, RetainExpansion, 7457d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 7458ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return ExprError(); 7459ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7460d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor if (!ShouldExpand || RetainExpansion) 7461ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return SemaRef.Owned(E); 7462be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 7463ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // We now know the length of the parameter pack, so build a new expression 7464ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // that stores that length. 7465ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 7466ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor E->getPackLoc(), E->getRParenLoc(), 7467cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor *NumExpansions); 7468ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor} 7469ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 7470be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregortemplate<typename Derived> 7471be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorExprResult 7472c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorTreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 7473c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SubstNonTypeTemplateParmPackExpr *E) { 7474c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor // Default behavior is to do nothing with this transformation. 7475c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor return SemaRef.Owned(E); 7476c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor} 7477c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 7478c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregortemplate<typename Derived> 7479c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorExprResult 7480454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 74813fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 74841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 748560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7486454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 748781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodedTypeInfo 748881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 748981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor if (!EncodedTypeInfo) 7490f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 74911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 749381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 74943fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 7496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 749781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor EncodedTypeInfo, 7498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 7499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 75001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 750260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7503454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 750492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Transform arguments. 750592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor bool ArgChanged = false; 7506ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> Args(SemaRef); 7507aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Args.reserve(E->getNumArgs()); 7508aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 7509aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor &ArgChanged)) 7510aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 7511aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 751292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (E->getReceiverKind() == ObjCMessageExpr::Class) { 751392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Class message: transform the receiver type. 751492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor TypeSourceInfo *ReceiverTypeInfo 751592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformType(E->getClassReceiverTypeInfo()); 751692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!ReceiverTypeInfo) 7517f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7518c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 751992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If nothing changed, just retain the existing message send. 752092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!getDerived().AlwaysRebuild() && 752192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 75223fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 752392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 752492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Build a new class message send. 752592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 752692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getSelector(), 7527f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis E->getSelectorLoc(), 752892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getMethodDecl(), 752992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getLeftLoc(), 753092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move_arg(Args), 753192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getRightLoc()); 753292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 753392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 753492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Instance message: transform the receiver 753592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 753692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor "Only class and instance messages may be instantiated"); 753760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Receiver 753892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor = getDerived().TransformExpr(E->getInstanceReceiver()); 753992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Receiver.isInvalid()) 7540f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 754192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 754292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If nothing changed, just retain the existing message send. 754392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (!getDerived().AlwaysRebuild() && 754492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 75453fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7546c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 754792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // Build a new instance message send. 75489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCMessageExpr(Receiver.get(), 754992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getSelector(), 7550f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis E->getSelectorLoc(), 755192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getMethodDecl(), 755292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getLeftLoc(), 755392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor move_arg(Args), 755492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor E->getRightLoc()); 7555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 75571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 755860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7559454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 75603fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 75631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 756460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7565454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 75663fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 75691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 757060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7571454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 7572f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // Transform the base expression. 757360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7574f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Base.isInvalid()) 7575f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7576f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor 7577f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // We don't need to transform the ivar; it will never change. 7578c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7579f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // If nothing changed, just retain the existing expression. 7580f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (!getDerived().AlwaysRebuild() && 7581f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base.get() == E->getBase()) 75823fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7583c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 75849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 7585f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->getLocation(), 7586f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->isArrow(), E->isFreeIvar()); 7587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 75891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 759060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7591454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 759212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // 'super' and types never change. Property never changes. Just 759312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall // retain the existing expression. 759412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (!E->isObjectReceiver()) 75953fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 75968ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian 7597e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // Transform the base expression. 759860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7599e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (Base.isInvalid()) 7600f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7601c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7602e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // We don't need to transform the property; it will never change. 7603c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7604e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor // If nothing changed, just retain the existing expression. 7605e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor if (!getDerived().AlwaysRebuild() && 7606e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor Base.get() == E->getBase()) 76073fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 760912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (E->isExplicitProperty()) 761012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 761112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getExplicitProperty(), 761212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getLocation()); 761312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall 761412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 761512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getType(), 761612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getImplicitPropertyGetter(), 761712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getImplicitPropertySetter(), 761812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall E->getLocation()); 7619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 76211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 762260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7623454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 7624f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // Transform the base expression. 762560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Base = getDerived().TransformExpr(E->getBase()); 7626f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (Base.isInvalid()) 7627f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 7628c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7629f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor // If nothing changed, just retain the existing expression. 7630f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor if (!getDerived().AlwaysRebuild() && 7631f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor Base.get() == E->getBase()) 76323fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7633c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 76349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 7635f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor E->isArrow()); 7636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 76381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 763960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7640454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 7641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 7642ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> SubExprs(SemaRef); 7643aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor SubExprs.reserve(E->getNumSubExprs()); 7644aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 7645aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor SubExprs, &ArgumentChanged)) 7646aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return ExprError(); 76471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 7649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 76503fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 76511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 7653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 7654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 7655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 76571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 765860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7659454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 7660c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall BlockDecl *oldBlock = E->getBlockDecl(); 7661a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 7662c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0); 7663c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 7664c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7665c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 7666c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall llvm::SmallVector<ParmVarDecl*, 4> params; 7667c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall llvm::SmallVector<QualType, 4> paramTypes; 7668a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 7669a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // Parameter substitution. 7670c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(), 7671c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->param_begin(), 7672c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->param_size(), 7673c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 0, paramTypes, ¶ms)) 7674a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor return true; 7675c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7676c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall const FunctionType *exprFunctionType = E->getFunctionType(); 7677c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall QualType exprResultType = exprFunctionType->getResultType(); 7678c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!exprResultType.isNull()) { 7679c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!exprResultType->isDependentType()) 7680c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = exprResultType; 7681c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall else if (exprResultType != getSema().Context.DependentTy) 7682c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = getDerived().TransformType(exprResultType); 7683a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian } 7684a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7685a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // If the return type has not been determined yet, leave it as a dependent 7686a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // type; it'll get set when we process the body. 7687c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType.isNull()) 7688c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = getSema().Context.DependentTy; 7689a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7690a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // Don't allow returning a objc interface by value. 7691c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType->isObjCObjectType()) { 7692c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall getSema().Diag(E->getCaretLocation(), 7693a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor diag::err_object_cannot_be_passed_returned_by_value) 7694c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall << 0 << blockScope->ReturnType; 7695a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor return ExprError(); 7696a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor } 7697711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7698c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall QualType functionType = getDerived().RebuildFunctionProtoType( 7699c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType, 7700c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall paramTypes.data(), 7701c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall paramTypes.size(), 7702c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldBlock->isVariadic(), 7703c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor 0, RQ_None, 7704c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall exprFunctionType->getExtInfo()); 7705c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->FunctionType = functionType; 7706711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7707711c52bb20d0c69063b52a99826fb7d2835501f1John McCall // Set the parameters on the block decl. 7708c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (!params.empty()) 7709c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->TheDecl->setParams(params.data(), params.size()); 7710a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7711a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // If the return type wasn't explicitly set, it will have been marked as a 7712a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // dependent type (DependentTy); clear out the return type setting so 7713a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // we will deduce the return type when type-checking the block's body. 7714c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (blockScope->ReturnType == getSema().Context.DependentTy) 7715c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall blockScope->ReturnType = QualType(); 7716a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 7717711c52bb20d0c69063b52a99826fb7d2835501f1John McCall // Transform the body 7718c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall StmtResult body = getDerived().TransformStmt(E->getBody()); 7719c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (body.isInvalid()) 7720711c52bb20d0c69063b52a99826fb7d2835501f1John McCall return ExprError(); 7721711c52bb20d0c69063b52a99826fb7d2835501f1John McCall 7722c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#ifndef NDEBUG 7723c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // In builds with assertions, make sure that we captured everything we 7724c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // captured before. 7725c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7726c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (oldBlock->capturesCXXThis()) assert(blockScope->CapturesCXXThis); 7727c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7728c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall for (BlockDecl::capture_iterator i = oldBlock->capture_begin(), 7729c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall e = oldBlock->capture_end(); i != e; ++i) { 77306b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall VarDecl *oldCapture = i->getVariable(); 7731c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7732c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall // Ignore parameter packs. 7733c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall if (isa<ParmVarDecl>(oldCapture) && 7734c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall cast<ParmVarDecl>(oldCapture)->isParameterPack()) 7735c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall continue; 7736c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7737c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall VarDecl *newCapture = 7738c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 7739c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall oldCapture)); 77406b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall assert(blockScope->CaptureMap.count(newCapture)); 7741c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall } 7742c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#endif 7743c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall 7744c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 7745c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall /*Scope=*/0); 7746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 77481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 774960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 7750454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 7751a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian ValueDecl *ND 7752a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 7753a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian E->getDecl())); 7754a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian if (!ND) 7755f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 77562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 7757a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian if (!getDerived().AlwaysRebuild() && 7758a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian ND == E->getDecl()) { 7759a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // Mark it referenced in the new context regardless. 7760a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian // FIXME: this is a bit instantiation-specific. 7761a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian SemaRef.MarkDeclarationReferenced(E->getLocation(), ND); 7762a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 77633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall return SemaRef.Owned(E); 7764a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian } 7765a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian 77662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation()); 776740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return getDerived().RebuildDeclRefExpr(NestedNameSpecifierLoc(), 77682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ND, NameInfo, 0); 7769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 77701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 7772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 7773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 7774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 77751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 777685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 777785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 77782865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildPointerType(PointeeType, Star, 7779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 7780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 77821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 778385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 778485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 77852865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Star, 7786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 7787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 77891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 77901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 779185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 779285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 779385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 77942865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 779585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 7796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 7797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 77981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 77991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 780085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 780185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 780285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 78032865474261a608c7873b87ba4af110d17907896dJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 780485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 7805577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7807577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 78081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 7809577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 7810577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 7811577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 7812577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 7813577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7814577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 7815577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 7816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 7817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 7818577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 78191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 78211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 78221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 78231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 7824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 7825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 7826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 7827577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 7828577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 7829577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 7830577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 7831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 78321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78339996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis IntegerLiteral ArraySize(SemaRef.Context, *Size, SizeType, 78349996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis /*FIXME*/BracketsRange.getBegin()); 78351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 7836577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 78371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 7838577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 78391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7840577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 78411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 78421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 7843577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 7844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 784585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 784685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 78471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 784885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 7849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7851577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 78521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 78531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 7854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 785585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 785685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 78571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 785885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 7859577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 78601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 78621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 78631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 7864577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 78659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7867577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 78681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 78699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SizeExpr, 7870577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 7871577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7872577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7873577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 78741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 78751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 7876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 78779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7878577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 7879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 78801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 78819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall SizeExpr, 7882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 7883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 7887e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson unsigned NumElements, 7888e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson VectorType::VectorKind VecKind) { 7889577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 7890e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 7891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 78921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7893577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 7895577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 7896577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 7897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 7898577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 7899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 79009996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 79019996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis AttributeLoc); 79029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 7903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 79041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 79061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 79071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 79089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *SizeExpr, 7909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 79109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 7911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 79121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7914577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 79151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 7916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 79171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 7918fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman unsigned Quals, 7919c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor RefQualifierKind RefQualifier, 7920fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman const FunctionType::ExtInfo &Info) { 79211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 7922c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor Quals, RefQualifier, 7923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 7924fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman getDerived().getBaseEntity(), 7925fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman Info); 7926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 79271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7928577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7929a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 7930a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 7931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 7932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 7933a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 7934ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 7935ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(D && "no decl found"); 7936ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (D->isInvalidDecl()) return QualType(); 7937ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 793892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // FIXME: Doesn't account for ObjCInterfaceDecl! 7939ed97649e9574b9d854fa4d6109c9333ae0993554John McCall TypeDecl *Ty; 7940ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (isa<UsingDecl>(D)) { 7941ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Using = cast<UsingDecl>(D); 7942ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(Using->isTypeName() && 7943ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-typename using"); 7944ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7945ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // A valid resolved using typename decl points to exactly one type decl. 7946ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(++Using->shadow_begin() == Using->shadow_end()); 7947ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 7948c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7949ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } else { 7950ed97649e9574b9d854fa4d6109c9333ae0993554John McCall assert(isa<UnresolvedUsingTypenameDecl>(D) && 7951ed97649e9574b9d854fa4d6109c9333ae0993554John McCall "UnresolvedUsingTypenameDecl transformed to non-using decl"); 7952ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Ty = cast<UnresolvedUsingTypenameDecl>(D); 7953ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 7954ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7955ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return SemaRef.Context.getTypeDeclType(Ty); 7956ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 7957ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 7958ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> 79592a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 79602a984cad5ac3fdceeff2bd99daa7b90979313475John McCall SourceLocation Loc) { 79612a984cad5ac3fdceeff2bd99daa7b90979313475John McCall return SemaRef.BuildTypeofExprType(E, Loc); 7962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 7966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 7967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 79702a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 79712a984cad5ac3fdceeff2bd99daa7b90979313475John McCall SourceLocation Loc) { 79722a984cad5ac3fdceeff2bd99daa7b90979313475John McCall return SemaRef.BuildDecltypeType(E, Loc); 7973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 7974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 7975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 7976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 7977833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 7978833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 7979d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 7980d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 7981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 79821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7983dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 7984dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 7985dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 7986dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 7987a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 7988c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 7989d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NamedDecl *FirstQualifierInScope) { 7990dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 7991dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 7992c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor SS.MakeTrivial(SemaRef.Context, Prefix, Range); 79932e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor if (SemaRef.BuildCXXNestedNameSpecifier(0, II, /*FIXME:*/Range.getBegin(), 79942e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor /*FIXME:*/Range.getEnd(), 79952e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor ObjectType, false, 79962e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor SS, FirstQualifierInScope, 79972e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor false)) 79982e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor return 0; 79992e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor 80002e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor return SS.getScopeRep(); 8001dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 8002dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 8003dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 8004dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 8005dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 8006dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 8007dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 8008dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 8009dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 8010dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 8011dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 8012dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 8013dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 8014dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 801514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor NamespaceAliasDecl *Alias) { 801614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, Alias); 801714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor} 801814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 801914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregortemplate<typename Derived> 802014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNestedNameSpecifier * 802114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 802214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor SourceRange Range, 8023dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 8024edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor QualType T) { 8025edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor if (T->isDependentType() || T->isRecordType() || 8026dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 8027a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here"); 8028dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 8029dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 8030dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 80311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8032dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 8033dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 8034dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 80351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8036d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 80371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 8038fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 8039d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 8040d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 8041fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 8042d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 8043d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 8044d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 8045d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 80461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 8047fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 8048fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor const IdentifierInfo &Name, 8049fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 805043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall QualType ObjectType, 805143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall NamedDecl *FirstQualifierInScope) { 8052fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor UnqualifiedId TemplateName; 8053fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName.setIdentifier(&Name, NameLoc); 8054d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Sema::TemplateTy Template; 8055d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor getSema().ActOnDependentTemplateName(/*Scope=*/0, 8056fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /*FIXME:*/SourceLocation(), 8057d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor SS, 8058fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor TemplateName, 8059b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType::make(ObjectType), 8060d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor /*EnteringContext=*/false, 8061d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Template); 806243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall return Template.get(); 8063d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 80641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 8066ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 8067fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 8068ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 8069fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation NameLoc, 8070ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 8071ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 8072fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor // FIXME: Bogus location information. 8073fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 8074fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 8075d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Sema::TemplateTy Template; 8076d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor getSema().ActOnDependentTemplateName(/*Scope=*/0, 8077fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor /*FIXME:*/SourceLocation(), 8078d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor SS, 8079d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Name, 8080b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType::make(ObjectType), 8081d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor /*EnteringContext=*/false, 8082d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor Template); 8083d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor return Template.template getAsVal<TemplateName>(); 8084ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 8085c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8086ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 808760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 8088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 8089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 80909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *OrigCallee, 80919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *First, 80929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Second) { 80939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Callee = OrigCallee->IgnoreParenCasts(); 80949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 80951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 8097f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 80989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType() && 80999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall !Second->getType()->isOverloadableType()) 81009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().CreateBuiltinArraySubscriptExpr(First, 81019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Callee->getLocStart(), 81029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second, OpLoc); 81031a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 81041a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 81059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc); 81069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall } else if (Second == 0 || isPostIncDec) { 81079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType()) { 8108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 8109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 81102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall UnaryOperatorKind Opc 8111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 81121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 81139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 8114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 81169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (!First->getType()->isOverloadableType() && 81179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall !Second->getType()->isOverloadableType()) { 8118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 8119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 81202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 812160d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 81229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 8123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 8124f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 81251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 8127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 81291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 81301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 8131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 81326e26689f5d513e24ad7783a4493201930fdeccc0John McCall UnresolvedSet<16> Functions; 81331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 81349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 8135ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 8136ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 8137ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 8138ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 81396e26689f5d513e24ad7783a4493201930fdeccc0John McCall Functions.append(ULE->decls_begin(), ULE->decls_end()); 8140ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 81419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl()); 8142ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 81431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 81459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Args[2] = { First, Second }; 81469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall unsigned NumArgs = 1 + (Second != 0); 81471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 8149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 81502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall UnaryOperatorKind Opc 8151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 81529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 8153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 81541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8155f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 81569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(), 8157ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 81589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall First, 81599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Second); 8160f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 8161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 81622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 816360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result 8164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 8165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 8166f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall return ExprError(); 81671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 81681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 8169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 81701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 817126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived> 817260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult 81739ae2f076ca5ab1feb3ba95629099ec2319833701John McCallTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 817426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation OperatorLoc, 817526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor bool isArrow, 8176f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor CXXScopeSpec &SS, 817726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *ScopeType, 817826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SourceLocation CCLoc, 8179fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 8180a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage Destroyed) { 81819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall QualType BaseType = Base->getType(); 81829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall if (Base->isTypeDependent() || Destroyed.getIdentifier() || 818326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor (!isArrow && !BaseType->getAs<RecordType>()) || 8184c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt (isArrow && BaseType->getAs<PointerType>() && 8185bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif !BaseType->getAs<PointerType>()->getPointeeType() 8186bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif ->template getAs<RecordType>())){ 818726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // This pseudo-destructor expression is still a pseudo-destructor. 81889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc, 818926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor isArrow? tok::arrow : tok::period, 8190fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SS, ScopeType, CCLoc, TildeLoc, 8191a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor Destroyed, 819226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*FIXME?*/true); 819326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor } 81942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 8195a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 81962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 81972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 81982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 81992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo.setNamedTypeInfo(DestroyedType); 82002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 820126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor // FIXME: the ScopeType should be tacked onto SS. 82022577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 82039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return getSema().BuildMemberReferenceExpr(Base, BaseType, 820426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor OperatorLoc, isArrow, 820526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor SS, /*FIXME: FirstQualifier*/ 0, 82062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameInfo, 820726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /*TemplateArgs*/ 0); 820826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor} 820926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor 8210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 8211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 8212577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 8213