TreeTransform.h revision 5ab75172051a6d2ea71a80a79e81c65519fd3462
1a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall//===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===/ 2577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 3577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// The LLVM Compiler Infrastructure 4577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 5577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file is distributed under the University of Illinois Open Source 6577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// License. See LICENSE.TXT for details. 7577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/ 8577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 9577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file implements a semantic tree transformation that takes a given 10577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// AST and rebuilds it, possibly transforming some nodes in the process. 11577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 12577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/ 13577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H 14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H 15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "Sema.h" 17dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h" 18c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h" 19657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h" 20b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h" 21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h" 2243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h" 2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h" 2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h" 25a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h" 26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h" 27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h" 28b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h" 29a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h" 30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm> 31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang { 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one 35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another. 36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of 381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template 40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the 41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the 42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar 43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and 44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters. 45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow 471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can 48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an 49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The 50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual. 51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which 53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node 54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions, 55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST 56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation 57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g., 58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes 59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create 60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node. 61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The 63670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(), 64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(), 65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely 66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations. 67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the 69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 7043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template 73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX 74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change. 75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild 76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may 77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps. 78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one 801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation 81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the 83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking 84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()). 85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform { 87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected: 88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &SemaRef; 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningStmtResult OwningStmtResult; 92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningExprResult OwningExprResult; 93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::StmtArg StmtArg; 94b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::ExprArg ExprArg; 95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::MultiExprArg MultiExprArg; 9643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor typedef Sema::MultiStmtArg MultiStmtArg; 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Initializes a new tree transformer. 99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Derived &getDerived() { return static_cast<Derived&>(*this); } 103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Derived &getDerived() const { 1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return static_cast<const Derived&>(*this); 107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the semantic analysis object used for 110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this tree transform. 111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &getSema() const { return SemaRef; } 1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Whether the transformation should always rebuild AST nodes, even 114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// if none of the children have changed. 115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function to specify when the transformation 117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// should rebuild all AST nodes. 118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlwaysRebuild() { return false; } 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the location of the entity being transformed, if that 121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, returns no source-location information. Subclasses can 124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// provide an alternative implementation that provides better location 125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information. 126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation getBaseLocation() { return SourceLocation(); } 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the name of the entity being transformed, if that 129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns an empty name. Subclasses can provide an alternative 132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// implementation with a more precise name. 133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor DeclarationName getBaseEntity() { return DeclarationName(); } 134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Sets the "base" location and entity when that 136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// information is known based on another transformation. 137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, the source location and entity are ignored. Subclasses can 139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// override this function to provide a customized implementation. 140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor void setBase(SourceLocation Loc, DeclarationName Entity) { } 1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief RAII object that temporarily sets the base location and entity 143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// used for reporting diagnostics in types. 144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor class TemporaryBase { 145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TreeTransform &Self; 146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OldLocation; 147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OldEntity; 1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor public: 150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase(TreeTransform &Self, SourceLocation Location, 1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Entity) : Self(Self) { 152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldLocation = Self.getDerived().getBaseLocation(); 153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldEntity = Self.getDerived().getBaseEntity(); 154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(Location, Entity); 155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ~TemporaryBase() { 158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(OldLocation, OldEntity); 159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor }; 1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determine whether the given type \p T has already been 163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformed. 164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses can provide an alternative implementation of this routine 1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// to short-circuit evaluation when it is known that a given type will 167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not change. For example, template instantiation need not traverse 168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// non-dependent types. 169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlreadyTransformed(QualType T) { 170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.isNull(); 171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transforms the given type into another type. 174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by creating a 176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// DeclaratorInfo for it and delegating to the appropriate 177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// function. This is expensive, but we don't mind, because 178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// this method is deprecated anyway; all users should be 179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// switched to storing DeclaratorInfos. 180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \returns the transformed type. 182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType TransformType(QualType T); 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transforms the given type-with-location into a new 185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type-with-location. 186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// 187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by delegating to the 188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// appropriate TransformXXXType to build a new type. Subclasses 189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// may override this function (to take over all type 190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// transformations) or some set of the TransformXXXType functions 191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// to alter the transformation. 192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *TransformType(DeclaratorInfo *DI); 193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transform the given type-with-location into a new 195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type, collecting location information in the given builder 196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// as necessary. 197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 200657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this routine transforms a statement by delegating to the 20343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// appropriate TransformXXXStmt function to transform a specific kind of 20443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// statement or the TransformExpr() function to transform an expression. 20543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to transform statements using some 20643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// other mechanism. 20743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 20843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \returns the transformed statement. 209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformStmt(Stmt *S); 2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 211657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 212657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E) { 220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false); 221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Transform the given expression. 224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand); 2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 236dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 237dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Decl *TransformDecl(Decl *D) { return D; } 23943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 24043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Transform the definition of the given declaration. 24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, invokes TransformDecl() to transform the declaration. 24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 24443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); } 2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2466cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// \brief Transform the given declaration, which was the first part of a 2476cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// nested-name-specifier in a member access expression. 2486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// This specific declaration transformation only applies to the first 2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// identifier in a nested-name-specifier of a member access expression, e.g., 2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// the \c T in \c x->T::member 2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// By default, invokes TransformDecl() to transform the declaration. 2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// Subclasses may override this function to provide alternate behavior. 2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor return cast_or_null<NamedDecl>(getDerived().TransformDecl(D)); 2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor } 2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor 259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, transforms all of the types and declarations within the 262dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 263dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 265a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 266c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType = QualType(), 267c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 27081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 27181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName TransformDeclarationName(DeclarationName Name, 276dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 277dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType = QualType()); 2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 281d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and nested-name-specifiers that occur within the template name. 283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 2843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName TransformTemplateName(TemplateName Name, 2853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType = QualType()); 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this operation transforms the type, expression, or 2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// declaration stored within the template argument and constructs a 291670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 292670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 293833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// 294833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// Returns true if there was an error. 295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output); 297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall void InventTemplateArgumentLoc(const TemplateArgument &Arg, 300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &ArgLoc); 301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a DeclaratorInfo for a type. 303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DeclaratorInfo *InventDeclaratorInfo(QualType T) { 304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.Context.getTrivialDeclaratorInfo(T, 305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().getBaseLocation()); 306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 3071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 31385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 31485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 315dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType 316dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TransformTemplateSpecializationType(const TemplateSpecializationType *T, 317dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType); 318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType 320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransformTemplateSpecializationType(TypeLocBuilder &TLB, 321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType); 323dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 32443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 32743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 329c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor OwningExprResult Transform##Node(Node *E, bool isAddressOfOperand); 330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 33785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 34385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 34585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \brief Build a new reference type given the type it references. 346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 34785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// By default, performs semantic analysis when building the 34885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// reference type. Subclasses may override this routine to provide 34985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// different behavior. 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 35185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \param LValue whether the type was written with an lvalue sigil 35285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// or an rvalue sigil. 35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildReferenceType(QualType ReferentType, 35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool LValue, 35585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new Objective C object pointer type. 36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildObjCObjectPointerType(QualType PointeeType, 36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 39185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 39285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 40185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 40285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVectorType(QualType ElementType, unsigned NumElements); 4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4767da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4777da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4787da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 4797da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 4807da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 4811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 4981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateLoc, 506833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation LAngleLoc, 507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *Args, 508833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall unsigned NumArgs, 509833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation RAngleLoc); 5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 5141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 5181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 5231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 5271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getTypenameType(NNS, 528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 5361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildTypenameType(NestedNameSpecifier *NNS, 539833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const IdentifierInfo *Id, 540833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR) { 541833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.CheckTypenameType(NNS, *Id, SR); 542dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 549dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 550dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 551dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 552a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 553c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 554c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 556dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 557dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 558dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 559dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 562dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 574dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 575dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 576d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 578d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 579d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 580d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 581d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 582d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 583d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 584d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 586d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 587d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 588d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and a set of 589d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// overloaded function templates. 590d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 591d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 592d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 593d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 594d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 595d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl); 5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 597d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 598d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 599d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 600d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 601d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 602d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 603d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 604d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 6053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 6063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 6071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 608ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// \brief Build a new template name given a nested name specifier and the 609ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// overloaded operator name that is referred to as a template. 610ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// 611ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// By default, performs semantic analysis to determine whether the name can 612ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 613ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// template name. Subclasses may override this routine to provide different 614ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// behavior. 615ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 616ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 617ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType); 618ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 66943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StmtArg Then, SourceLocation ElseLoc, 68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Else) { 68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else)); 68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) { 69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnStartOfSwitchStmt(move(Cond)); 69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body)); 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 7221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Init, ExprArg Cond, ExprArg Inc, 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond), 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Inc), RParenLoc, move(Body)); 73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 7641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 7731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclaratorInfo *Declarator, 78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 7911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 80043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 81143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 81243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 81343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 81443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 81543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 821a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier, 822a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 823c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor NamedDecl *ND, SourceLocation Loc, 824c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 825a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 826a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setScopeRep(Qualifier); 827a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setRange(QualifierRange); 828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildDeclarationNameExpr(Loc, ND, 829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false, 830a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor &SS, 831c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 8351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 843a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 845a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 846a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 847a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 848a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 849a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 850a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation DestroyedTypeLoc, 851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType, 852a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier, 853a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceRange QualifierRange) { 854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXScopeSpec SS; 855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Qualifier) { 856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setRange(QualifierRange); 857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setScopeRep(Qualifier); 858a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 861a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType)); 8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 865a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OperatorLoc, 866a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor isArrow? tok::arrow : tok::period, 867a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedTypeLoc, 868a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Name, 869a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Sema::DeclPtrTy::make((Decl *)0), 870a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor &SS); 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 8741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr)); 881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 8841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 8875ab75172051a6d2ea71a80a79e81c65519fd3462John McCall OwningExprResult RebuildSizeOfAlignOf(DeclaratorInfo *DInfo, 8885ab75172051a6d2ea71a80a79e81c65519fd3462John McCall SourceLocation OpLoc, 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 8905ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getSema().CreateSizeOfAlignOfExpr(DInfo, OpLoc, isSizeOf, R); 891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 8931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 8951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 9001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 9051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 9361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 9401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 94183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 94283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 94383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *Member) { 945d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 946d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 947d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 950d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow, 951d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 952d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 953d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 954d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 9551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 95783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 95883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 95983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 96083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 96183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 962017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isArrow? tok::arrow : tok::period, 964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 965017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Member->getDeclName(), 96683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 96783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor &SS); 968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 9711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 9781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(), 979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)RHS.get()); 980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 9821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.release(); 984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.release(); 985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 9891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 9971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new implicit cast expression. 10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new implicit cast without any semantic analysis. 1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, bool isLvalue) { 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitCastExpr *ICE 10081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (getSema().Context) ImplicitCastExpr(T, Kind, 1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)SubExpr.release(), 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isLvalue); 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned(ICE); 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 10151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy, 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy.getAsOpaquePtr(), 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 10492d1c21414199a7452f122598189363a3922605b1Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::period, AccessorLoc, 10512d1c21414199a7452f122598189363a3922605b1Douglas Gregor DeclarationName(&Accessor), 1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 10561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBraceLoc) { 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 10661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 10851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 11151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 11901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 11941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 11951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 11971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 11991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 12001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 12011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 12031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 12051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 12061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 12291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 12451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 12771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 129088650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 129488650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 13271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 13321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 13341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ThisType) { 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1354f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 13661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 13671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ conditional declaration expression. 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc, 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqLoc, 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var) { 1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc, 1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EqLoc, 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var)); 1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 13921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 14391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS, 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 14521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1464f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier, 1465f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor SourceRange QualifierRange, 1466f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor TemplateName Template, 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TemplateLoc, 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1469833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *TemplateArgs, 1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumTemplateArgs, 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc) { 1472f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange, 1473f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Template, TemplateLoc, 1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, 1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgs, NumTemplateArgs, 1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc); 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 1487ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ 1488ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson SourceLocation(), 1489ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson T, Constructor, IsElidable, 1490f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson move(Args)); 1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15340dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1537a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1538a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1540c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1541c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 15420dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult Base = move(BaseE); 1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1544a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1546a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1547a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 15481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, 1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Base), OperatorLoc, OpKind, 1551017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor MemberLoc, 1552017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Name, 1553a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 1554c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor &SS, 1555c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Build a new member reference expression with explicit template 15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// arguments. 15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 15643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow, 15653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NestedNameSpecifier *Qualifier, 15673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceRange QualifierRange, 15683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName Template, 15693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation TemplateNameLoc, 15703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierInScope, 15713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation LAngleLoc, 1572833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *TemplateArgs, 15733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor unsigned NumTemplateArgs, 15743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation RAngleLoc) { 15753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult Base = move(BaseE); 15763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 15771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: We're going to end up looking up the template based on its name, 15832d1c21414199a7452f122598189363a3922605b1Douglas Gregor // twice! Also, duplicates part of Sema::BuildMemberAccessExpr. 15843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor DeclarationName Name; 15853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) 15863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = ActualTemplate->getDeclName(); 15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (OverloadedFunctionDecl *Ovl 15883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = Template.getAsOverloadedFunctionDecl()) 15893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Ovl->getDeclName(); 1590ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else { 1591ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateName *DTN = Template.getAsDependentTemplateName(); 1592ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1593ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name = DTN->getIdentifier(); 1594ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else 1595ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name = SemaRef.Context.DeclarationNames.getCXXOperatorName( 1596ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DTN->getOperator()); 1597ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } 15981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 15993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OperatorLoc, OpKind, 16003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateNameLoc, Name, true, 16013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor LAngleLoc, TemplateArgs, 16023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NumTemplateArgs, RAngleLoc, 16033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Sema::DeclPtrTy(), &SS); 16043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 16151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 16311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 16421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 16471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 16501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BuiltinLoc, false, false); 1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 16541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 167443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 167543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 168043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 168343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 168543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 168643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 168943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 169043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 169143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 169243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 169343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 169443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 169543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 169743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned(E.takeAs<Stmt>()); 169843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 16991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 170143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 170243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 17031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1705670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isAddressOfOperand) { 1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1715c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E), \ 1716c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 17181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1721657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1722657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1723657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1726a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1727c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1728c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 17290979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 17300979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 173243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1734dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 17351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1736c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1737c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 17401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1742c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1743a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1744c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1750a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1751a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1752a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1756a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1757c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1758c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 17591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1763dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 17641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1765dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1766dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1767dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1769dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1770dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1772dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1773dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1774dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1778dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1779fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 1780dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1781d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1782d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1784dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1785dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1786dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1787dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1791dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1792dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1793dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1795dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 17961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1797dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1798dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1799dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 18001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 180181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1802dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 1803dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 180481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 180581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 180681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 180781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 180881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 180981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 181181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 181281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 181381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 181481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 18151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 181781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 181881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 1820dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType T; 1821dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor if (!ObjectType.isNull() && 1822dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor isa<TemplateSpecializationType>(Name.getCXXNameType())) { 1823dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TemplateSpecializationType *SpecType 1824dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = cast<TemplateSpecializationType>(Name.getCXXNameType()); 1825dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = TransformTemplateSpecializationType(SpecType, ObjectType); 1826dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor } else 1827dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = getDerived().TransformType(Name.getCXXNameType()); 182881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 182981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 18301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 183181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 18321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 183381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 183481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 18361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 183781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 183881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 183981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 184081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 18411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 18423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 18433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 18451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1860d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1863d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl(); 1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 18681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1870d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1873d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1875d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1876d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1878d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1879d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl); 1880d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1882d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1884d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1885d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1887d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1889d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1890dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 1891dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 1892d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1894ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1895ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(), 1896ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1897ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 1898ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, DTN->getOperator(), 1899ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1900d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 19011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1902d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 19031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1904d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1905d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1906d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 19071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1908d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1909d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1910d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 19111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1912d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1913d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 19141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1915d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl(); 1916d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 19171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1918d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1919d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1920d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 19211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1922d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1923d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1924d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 19251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1926d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransOvl); 1927d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1928d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1929d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 1934670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1935670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 1936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::llvm_unreachable("null template argument in TreeTransform"); 1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 1941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc)); 1942833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 1946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 1947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 1950670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 1952828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 1953833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 1955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 1956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1957833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 1958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 1959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 1960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 1962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 1963833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 1964833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 1965833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 1966833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 19671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1968670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1969833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DeclaratorInfo *DI = Input.getSourceDeclaratorInfo(); 1970833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 1971833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = InventDeclaratorInfo(Input.getArgument().getAsType()); 1972833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1973833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 1974833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 1975833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1976833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 1977833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1978670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1980670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1981833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 1982972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 1983972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 1984972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 1985833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemporaryBase Rebase(*this, SourceLocation(), Name); 1986670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1987833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 1988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1989828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 1990828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 1991828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 1992828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Action::Unevaluated); 1993828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr); 1994828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (E.isInvalid()) 1995828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = NULL; 1996828bff2079b6a91ecd7ed5b842c59527d7682789John McCall else { 1997828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = E.takeAs<Expr>(); 1998828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr->Retain(); 1999828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 2000828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 2001828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2002828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 2003833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2004670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2006670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 2007670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 20081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 2009670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 20101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2011833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 2012833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 2013833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2014833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Sema::OwningExprResult E 2015833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 2017833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2018833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *ETaken = E.takeAs<Expr>(); 2019828bff2079b6a91ecd7ed5b842c59527d7682789John McCall ETaken->Retain(); 2020833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken); 2021833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2022670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 2025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 2026670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 20271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 2028670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 2029670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 20301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2031833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2032833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2033833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2034828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2035828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2036828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2037828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2038833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2039833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2040828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2041670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2042670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 20431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 2044670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 2045828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Result, Input.getLocInfo()); 2046833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2047670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2048670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2050670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2051833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2052670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2053670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2058577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T); 20664802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(DI); 20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 20721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 2074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallDeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) { 2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 20801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 20821bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 2083a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 2084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 20851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, TL); 2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 20891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TLB.getDeclaratorInfo(SemaRef.Context, Result); 2091577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 2098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::llvm_unreachable("unhandled type loc!"); 2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 21131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedTypeLoc T) { 2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Qualifiers Quals = T.getType().getQualifiers(); 2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 21281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make 2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work. 2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \ 2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 215685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType, \ 215785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); \ 2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2162a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \ 2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setSigilLoc(TL.getSigilLoc()); \ 2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0) 2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BuiltinTypeLoc T) { 2171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB, 2177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FixedWidthIntTypeLoc T) { 2178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2182a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ComplexTypeLoc T) { 2184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointerTypeLoc TL) { 2191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(PointerType); 2192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BlockPointerTypeLoc TL) { 2198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(BlockPointerType); 2199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 220485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 220585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 220685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 220785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc TL) { 220985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 221085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 221285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 221385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 221485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 221585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 221685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 221785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 221985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 222085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 222185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 222285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 222385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 222485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 222585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 222685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 222785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 222885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 222985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 223085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 223185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 223285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 223385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 223485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 223585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 223685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 2237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2238a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall LValueReferenceTypeLoc TL) { 224185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2242a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RValueReferenceTypeLoc TL) { 224885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc TL) { 2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2268a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 227185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 227285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 22831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc TL) { 2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2294a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 229885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 229985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 23071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc TL) { 2322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 233285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 233385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2343a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc TL) { 2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2355670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2356670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2357670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2363a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 237385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 23831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayTypeLoc TL) { 2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2396670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2397670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 23981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 241485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 24191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc TL) { 2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2441670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2442670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2443670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2450eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2451eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2465a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc TL) { 2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2485a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 24911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2496a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc TL) { 2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2504a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2508a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 25151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 25191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc TL) { 2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Transform the parameters. 2529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 2538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo(); 2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall assert(OldDI->getType() == T->getArgType(i)); 2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(OldDI); 2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewDI == OldDI) 2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = OldParm; 2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else 2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = ParmVarDecl::Create(SemaRef.Context, 2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getDeclContext(), 2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getLocation(), 2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getIdentifier(), 2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI->getType(), 2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI, 2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getStorageClass(), 2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* DefArg */ NULL); 2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.push_back(NewType); 2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamDecls.push_back(NewParm); 2571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 25721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2590a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc TL) { 2599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc TL) { 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc TL) { 2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprType *T = TL.getTypePtr(); 2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2644670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2645670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 26591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2662a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc TL) { 2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfType *T = TL.getTypePtr(); 2670a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: should be an inner type, or at least have a DeclaratorInfo. 2672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Underlying.isNull()) 2674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfType(Underlying); 2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 26831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2688577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc TL) { 2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2695670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2696670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2699577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 2706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 2710a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc TL) { 2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 2721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc TL) { 2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 2744577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2746577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2747577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 2752a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2761577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27627da2431c23ef1ee8acb114e39692246e1801afc2John McCall 27637da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc TL) { 2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 27697da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 27707da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 27717da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 27721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 27857da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 27861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2788577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2789577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateTypeParmTypeLoc TL) { 2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 2793577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2794577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 27951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 279649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2797a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2798a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall SubstTemplateTypeParmTypeLoc TL) { 2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 280049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 280149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 280249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2803dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType 2804dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType( 2805a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateSpecializationTypeLoc TL) { 2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(TLB, TL, QualType()); 2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2810833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2811833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2812833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *TST, 2813833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2814833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: this entire method is a temporary workaround; callers 2815833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // should be rewritten to provide real type locs. 2816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2817833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Fake up a TemplateSpecializationTypeLoc. 2818833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder TLB; 2819833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL 2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0)); 2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2822828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceLocation BaseLoc = getDerived().getBaseLocation(); 2823828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2824828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setTemplateNameLoc(BaseLoc); 2825828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setLAngleLoc(BaseLoc); 2826828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setRAngleLoc(BaseLoc); 2827833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2828833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &TA = TST->getArg(i); 2829833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc TAL; 2830833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().InventTemplateArgumentLoc(TA, TAL); 2831833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.setArgLocInfo(i, TAL.getLocInfo()); 2832833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder IgnoredTLB; 2835833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType); 2836dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 2837dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 2838dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 2839577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2840833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 2841833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 2842833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2843833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 2844833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 28451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2846dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2847577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2848577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2850833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> NewTemplateArgs(T->getNumArgs()); 2851833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) 2852833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), 2853833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTemplateArgs[i])) 2854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2856833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 2857833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2858833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 2859833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 2860833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 2861833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getLAngleLoc(), 2862833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTemplateArgs.data(), 2863833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTemplateArgs.size(), 2864833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getRAngleLoc()); 28651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2866833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 2867833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 2868833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 2869833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 2870833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 2871833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 2872833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 2873833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 2874833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 28751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2876833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 2877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2880a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2881a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 2882a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc TL) { 2883a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 2884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2888577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2890577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2892577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 2897a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 2898a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2902577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2903a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 2904a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2905a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2906a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2907577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2910a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB, 2911a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc TL) { 2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameType *T = TL.getTypePtr(); 2913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /* FIXME: preserve source information better than this */ 2915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR(TL.getNameLoc()); 2916833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2917577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR); 2919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2920577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2922a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 2923a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2924577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 29251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 2926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2928577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 29341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, NewTemplateId); 2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR); 2938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2939a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2942a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result); 2943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2948577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCInterfaceTypeLoc TL) { 295254e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCInterfaceType unimplemented"); 295354e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 2954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2957a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 2959a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCObjectPointerTypeLoc TL) { 296054e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCObjectPointerType unimplemented"); 296154e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 296224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 296324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 296543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 29701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 297443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 298643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 298943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 29901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 299243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 29941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 299643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 299943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 300043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 300143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 300243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 300343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 300543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 300643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 300843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // The case value expressions are not potentially evaluated. 300943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 30101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the left-hand case value. 301243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult LHS = getDerived().TransformExpr(S->getLHS()); 301343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (LHS.isInvalid()) 301443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the right-hand case value (for the GNU case-range extension). 301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult RHS = getDerived().TransformExpr(S->getRHS()); 301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (RHS.isInvalid()) 301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 303043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 303843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 304143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 304543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 304643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 305143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 305843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 306143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 306343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 306443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 306743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 30681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 30691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 307043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 307143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 307243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 307343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 30761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 307943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 30911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 30921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then), 30941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 309543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 309843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 310043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 310143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 310243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 310343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 310643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond)); 310743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 311043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 311143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 311243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 311343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 311543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 311643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 311743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 311843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 312143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 312443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 312543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 31291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 313143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body)); 314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 314543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 314743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 314943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 315243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 315343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 315443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 315743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 316243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 316743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 317043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 317143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 317243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 317543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 317743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 318043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 318243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Init), move(Cond), move(Inc), 319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 320043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 32021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 32031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 32051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 320843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 321043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 321243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 321343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 321443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 321643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 321743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 32181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 321943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 322043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 322143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 322243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 322343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 322443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 322543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 32271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 32331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 323443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 324143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 32431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 324443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 325143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 325343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 325443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 325643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 325943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 326043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 326243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 326343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 32641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 32661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 327543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 32761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 327743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 327843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 328043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 328343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 32841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 328643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 328843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 329143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 32931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 329443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 330043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 331343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 331543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 331643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 33171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 331843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 332143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 332243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 33231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 332443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 332543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 33261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 332743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 332943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 33321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 33351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 334143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 334343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 334643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 334843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 335143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 335443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclaratorInfo(), 335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 335743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 336043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 337043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 33781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 338343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 33891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 33981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 340343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 34101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 341143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 34131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 341443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 3417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 3418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 34191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3421c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E, 3422c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 34251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3428c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E, 3429c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3430a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3431a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 3432a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3433a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor E->getQualifierRange()); 3434a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 3435a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3436a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3437a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 34381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *ND 3439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3443a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 3444a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 3445a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 3446a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor !E->hasExplicitTemplateArgumentList()) 34471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3449a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: We're losing the explicit template arguments in this transformation. 3450a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3451833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs()); 3452a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3453833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], 3454833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransArgs[I])) 3455a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3456a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3457a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3458a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: Pass the qualifier/qualifier range along. 3459a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 3460c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ND, E->getLocation(), 3461c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 3462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3466c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E, 3467c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3473c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E, 3474c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3480c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E, 3481c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3487c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E, 3488c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3494c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E, 3495c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3501c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformParenExpr(ParenExpr *E, 3502c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 35141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3516c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E, 3517c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3518c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr(), 3519c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor E->getOpcode() == UnaryOperator::AddrOf); 3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3533c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E, 3534c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 35365ab75172051a6d2ea71a80a79e81c65519fd3462John McCall DeclaratorInfo *OldT = E->getArgumentTypeInfo(); 35375557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 35385ab75172051a6d2ea71a80a79e81c65519fd3462John McCall DeclaratorInfo *NewT = getDerived().TransformType(OldT); 35395ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35425ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35455ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 35461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 35561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3572c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E, 3573c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3596c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E, 3597c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 36151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 36261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3636c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E, 3637c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 364283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 364383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 36441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 364583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 364683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange()); 3647c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 364883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 364983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 36501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *Member 3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 365883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Member == E->getMemberDecl()) 36601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 366883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 366983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 36711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Member); 3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3676c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCastExpr(CastExpr *E, 3677c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3684c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E, 3685c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 36981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 37031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3706c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CompoundAssignOperator *E, 3707c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3708c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformBinaryOperator(E, isAddressOfOperand); 3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3713c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E, 3714c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 373447e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 37351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 373647e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 37411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3742c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E, 3743c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 37445557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 37455557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 37465557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have type information here? It seems like we won't, 37475557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // so do we even need to transform the type? 3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 37591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 37621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isLvalueCast()); 3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3768c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E, 3769c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 37711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3776c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E, 3777c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 37811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 37841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getTypeAsWritten()); 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 37971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3806c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E, 3807c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeTypeLoc 3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 38141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 38271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3836c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E, 3837c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 38441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 38471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3856c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E, 3857c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 38711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBraceLoc()); 3875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3879c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E, 3880c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 388343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 388843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 39151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 39281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 39311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 3949c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ImplicitValueInitExpr *E, 3950c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 39515557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 39525557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 39535557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 39545557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3968c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E, 3969c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 39721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 3976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3996c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E, 3997c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 4006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 4015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 4018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4021c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E, 4022c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4028c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult 4029c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E, 4030c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 40311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4047c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E, 4048c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 40531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 40661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4074c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E, 4075c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 40921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4101c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E, 4102c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 41031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4108c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E, 4109c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4114c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor OwningExprResult First 4115c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor = getDerived().TransformExpr(E->getArg(0), 4116c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor E->getNumArgs() == 1 && E->getOperator() == OO_Amp); 4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 41301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 41351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4142c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E, 4143c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4144c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCallExpr(E, isAddressOfOperand); 4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4149c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E, 4150c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 41571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 41701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 41731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 4176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 41801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 4181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4191c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E, 4192c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4193c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4198c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E, 4199c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4200c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 4206c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXReinterpretCastExpr *E, 4207c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4208c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4213c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E, 4214c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4215c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 4221c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXFunctionalCastExpr *E, 4222c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 42261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 42391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4252c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E, 4253c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 42561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 42741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4293c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E, 4294c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 42951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 4301c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXNullPtrLiteralExpr *E, 4302c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 43031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4308c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E, 4309c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 43111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4325c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E, 4326c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 43331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4340c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E, 4341c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 43421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(Param); 4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4356c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E, 4357c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 43661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4376c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E, 4377c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 43781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *Var 437943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl())); 4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Var) 4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 43841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Var == E->getVarDecl()) 4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(), 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getStartLoc(), 4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var); 4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4394c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E, 4395c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 441943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 44341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 44481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4453c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E, 4454c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 44601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Operand.get() == E->getArgument()) 44611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4471a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 4472c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXPseudoDestructorExpr *E, 4473c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4474a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4475a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 4476a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 44771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4478a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 4479a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4480a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4481a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 4482a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 44831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4484a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 4485a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 4486a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 4487a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 4488a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 4489a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 4490a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4492a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 4493a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 4494a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 4495a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 4496a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 44971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4498a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 4499a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 4500a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 4501a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 4502a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 4503a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 4504a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4505a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 45061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4507a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 4508a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr( 4510c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor UnresolvedFunctionNameExpr *E, 4511c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // There is no transformation we can apply to an unresolved function name. 45131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4518c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E, 4519c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 45211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 4523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 4528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 45291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 4531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 45331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr( 4544c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor UnresolvedDeclRefExpr *E, 4545c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4547f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4548f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 455381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 455481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 455581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 45561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name == E->getDeclName()) 45601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnresolvedDeclRefExpr(NNS, 4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 4566c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 4567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4571c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E, 4572c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4573fd2300e1ee0eab6c51862a92d3f3c72540b36b23Douglas Gregor TemporaryBase Rebase(*this, E->getTemplateNameLoc(), DeclarationName()); 4574fd2300e1ee0eab6c51862a92d3f3c72540b36b23Douglas Gregor 45751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateName(E->getTemplateName()); 4577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Template.isNull()) 4578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4580f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4581f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor if (E->getQualifier()) { 4582f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4583f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4584f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor if (!Qualifier) 4585f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return SemaRef.ExprError(); 4586f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 4587f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor 4588833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs()); 4589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4590833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], 4591833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransArgs[I])) 4592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Would like to avoid rebuilding if nothing changed, but we can't 4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // compare template arguments (yet). 45971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: It's possible that we'll find out now that the template name 4599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // actually refers to a type, in which case the caller is actually dealing 4600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // with a functional cast. Give a reasonable error message! 4601f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(), 4602f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Template, E->getTemplateNameLoc(), 4603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLAngleLoc(), 4604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.data(), 4605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.size(), 4606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRAngleLoc()); 4607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4611c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E, 4612c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 46271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 4645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 46501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to 46511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the 4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself 4653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique. 4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4656c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E, 4657c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 46681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new 46691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the 4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the 4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression. 4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 4675c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXExprWithTemporaries *E, 4676c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned( 4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->shouldDestroyTemporaries())); 4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 4689c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXTemporaryObjectExpr *E, 4690c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 47151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 47261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 4740c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXUnresolvedConstructExpr *E, 4741c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 47621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 47661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 47671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr( 4780c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXUnresolvedMemberExpr *E, 4781c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47876cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Start the member reference and compute the object's type. 4788a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Sema::TypeTy *ObjectType = 0; 47891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4790a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getOperatorLoc(), 4791a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4792a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType); 4793a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (Base.isInvalid()) 4794a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 47951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47966cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 47976cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 4798c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 47996cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 48006cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 48016cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 48021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4803a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4804a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4805a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4806a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4807c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType::getFromOpaquePtr(ObjectType), 4808c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 4809a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4810a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4811a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 48121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 4814dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 4815dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 481681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 481781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!E->hasExplicitTemplateArgumentList()) { 48203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 48213b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 48223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 48233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Base.get() == E->getBase() && 48243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 48253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 48263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 48271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 48303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 48313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 48323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 48333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 48343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 48353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 48363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope); 48373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 48383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 48393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This is an ugly hack, which forces the same template name to 48403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // be looked up multiple times. Yuck! 4841ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemporaryBase Rebase(*this, E->getMemberLoc(), DeclarationName()); 4842ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName OrigTemplateName; 4843ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) 4844ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OrigTemplateName = SemaRef.Context.getDependentTemplateName(0, II); 4845ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else 4846ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OrigTemplateName 4847ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor = SemaRef.Context.getDependentTemplateName(0, 4848ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.getCXXOverloadedOperator()); 48491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 48511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getDerived().TransformTemplateName(OrigTemplateName, 48523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 48533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (Template.isNull()) 48543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 48551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4856833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs()); 48573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4858833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], 4859833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransArgs[I])) 48603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 48613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 48621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 4864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4866a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4867a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 48683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Template, 4869c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor E->getMemberLoc(), 48703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 48713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getLAngleLoc(), 48723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.data(), 48733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.size(), 48743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getRAngleLoc()); 4875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4879c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E, 4880c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 48811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4886c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E, 4887c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 4892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 48961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 4899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 4900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4905c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E, 4906c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4914c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E, 4915c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 49161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4921c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E, 4922c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 49231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 4924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 4925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 4926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 4927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 49311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 49321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 4934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 4935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 49381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4943c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E, 4944c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4952c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E, 4953c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 496109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 4962c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ObjCImplicitSetterGetterRefExpr *E, 4963c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4971c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E, 4972c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4980c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E, 4981c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4989c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E, 4990c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 4993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 4999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 5000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 50011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 50041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 50051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 5008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5013c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E, 5014c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 50171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5022c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E, 5023c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 50261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 5031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 503485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 503585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 503685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star, 5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 504185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 504285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 504385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star, 5044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 504985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 505085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 505185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 505285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(), 505385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 505885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 505985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 506085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 50610953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 506285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 50661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 506785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType, 506885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 506985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil, 5070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseEntity()); 5071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 5075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 5076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 5078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 5079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 5081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 5082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 5083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 5084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 50851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 50871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 50881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 50891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 5090577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 5091577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 5092577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 5093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 5094577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 5095577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 5096577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 5097577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 50981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5099577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeType.isNull()) 5100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 51011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 51031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 5104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 51051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 5106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 5111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 511385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 511485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 51151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 511685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 5122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 512385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 512485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 51251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 512685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 5132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 51361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5137577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5138577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5139577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5141577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 5144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 51481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5154577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 5155577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 5156577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 5157577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 5158577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 5162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 5163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 5165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 5166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 5168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 5170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 5179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 51831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 5184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 51851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 5186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 51871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 5188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 5189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 5190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 5191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 5195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 5196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 5200577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 5201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5204577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 5205577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 5206577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5207577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5208577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 5210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 5211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5212577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 5215833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 5216833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 5217833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation LAngleLoc, 5218833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *Args, 5219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall unsigned NumArgs, 5220833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation RAngleLoc) { 5221833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, LAngleLoc, 5222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Args, NumArgs, RAngleLoc); 5223577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5225dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5226dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5227dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5228dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5229a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 5230c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 5231c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 5232dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 5233dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 5234dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 5235dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 5236dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 52371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 5238495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 5239c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 5240c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 5241495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor false)); 5242dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5243dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5244dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5245dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5246dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5247dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5248dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 5249dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 5250dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5251dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5252dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5253dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5254dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5255dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5256dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 5257dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 5258dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 5259dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 52600953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!T.hasQualifiers() && "Can't get cv-qualifiers here"); 5261dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 5262dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 5263dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 52641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5265dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 5266dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 5267dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 52681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5269d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 52701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5271d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5272d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5273d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 52741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 5275d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 5276d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5277d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5278d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 52791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5280d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5281d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5282d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl) { 5283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl); 5284d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5285d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5286d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 52871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5288d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 52893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 52903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 5291d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 5292d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 52931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 5294014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor UnqualifiedId Name; 5295014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation()); 52963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 52973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 52983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 5299014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name, 53003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor ObjectType.getAsOpaquePtr()) 53013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 5302d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 53031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5305ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5306ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5307ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 5308ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 5309ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor CXXScopeSpec SS; 5310ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 5311ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setScopeRep(Qualifier); 5312ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 5313ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SourceLocation SymbolLocations[3]; // FIXME: Bogus location information. 5314ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(), 5315ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Operator, SymbolLocations); 5316ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getSema().ActOnDependentTemplateName( 5317ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 5318ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS, 5319ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name, 5320ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType.getAsOpaquePtr()) 5321ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor .template getAsVal<TemplateName>(); 5322ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5323ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5324ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 53251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 5327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 5328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 5329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 5330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 5331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 5332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 5333f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl DeclRefExpr *DRE 5334f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts()); 5335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 53361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 5338f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 5339f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (!FirstExpr->getType()->isOverloadableType() && 5340f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl !SecondExpr->getType()->isOverloadableType()) 5341f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return getSema().CreateBuiltinArraySubscriptExpr(move(First), 5342f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl DRE->getLocStart(), 5343f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(Second), OpLoc); 5344f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl } else if (SecondExpr == 0 || isPostIncDec) { 5345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 5346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 5347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 53481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 53501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 5352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 53541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 5355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 5356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 5357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 5358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 53591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 5361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 53631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 5366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 5367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 53691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 5371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 5372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 53731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we have to check 5375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // IsAcceptableNonMemberOperatorCandidate for each of these? 53768f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F) 5377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Functions.insert(*F); 53781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 5380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 5381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 53821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName OpName 5383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 5384644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs, 5385644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl Functions); 53861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 5388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 53891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 5391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 5392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 53931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5394f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 5395f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return SemaRef.CreateOverloadedArraySubscriptExpr(DRE->getLocStart(), OpLoc, 5396f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(First),move(Second)); 5397f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 5398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 53991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 5400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 54011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 5403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 54051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 54081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 5409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 5412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 5414