TreeTransform.h revision 8cfe5a784133d90bf329fd20801824a6f71bb8ca
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, 506d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Args); 5071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 5151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 5201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 5241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getTypenameType(NNS, 525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 5261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 5331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildTypenameType(NestedNameSpecifier *NNS, 536833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const IdentifierInfo *Id, 537833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR) { 538833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.CheckTypenameType(NNS, *Id, SR); 539dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 5401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 541dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 542dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 543dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 549a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 550c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 551c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 552dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 553dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 554dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 556dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 557dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 558dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 559dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 562dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 573d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 574d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 575d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 576d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 578d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 579d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 580d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 581d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 582d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 583d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 584d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and a set of 586d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// overloaded function templates. 587d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 588d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 589d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 590d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 591d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 592d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl); 5931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 594d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 595d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 596d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 597d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 598d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 599d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 600d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 601d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 6023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 6033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 6041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 605ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// \brief Build a new template name given a nested name specifier and the 606ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// overloaded operator name that is referred to as a template. 607ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// 608ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// By default, performs semantic analysis to determine whether the name can 609ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 610ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// template name. Subclasses may override this routine to provide different 611ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /// behavior. 612ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 613ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 614ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType); 615ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 6571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 66943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 6771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StmtArg Then, SourceLocation ElseLoc, 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Else) { 67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else)); 68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) { 68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnStartOfSwitchStmt(move(Cond)); 68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body)); 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Init, ExprArg Cond, ExprArg Inc, 73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 7311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond), 73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Inc), RParenLoc, move(Body)); 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 78143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclaratorInfo *Declarator, 78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 81143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 81243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 818a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier, 819a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 820c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor NamedDecl *ND, SourceLocation Loc, 821c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 822a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 823a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setScopeRep(Qualifier); 824a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setRange(QualifierRange); 825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildDeclarationNameExpr(Loc, ND, 826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false, 827a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor &SS, 828c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 840a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 842a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 843a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 844a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 845a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 846a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 847a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation DestroyedTypeLoc, 848a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType, 849a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier, 850a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceRange QualifierRange) { 851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXScopeSpec SS; 852a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Qualifier) { 853a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setRange(QualifierRange); 854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setScopeRep(Qualifier); 855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 8571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 858a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType)); 8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OperatorLoc, 863a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor isArrow? tok::arrow : tok::period, 864a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedTypeLoc, 865a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Name, 866a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Sema::DeclPtrTy::make((Decl *)0), 867a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor &SS); 8681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 8776ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr)); 878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 8845ab75172051a6d2ea71a80a79e81c65519fd3462John McCall OwningExprResult RebuildSizeOfAlignOf(DeclaratorInfo *DInfo, 8855ab75172051a6d2ea71a80a79e81c65519fd3462John McCall SourceLocation OpLoc, 886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 8875ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getSema().CreateSizeOfAlignOfExpr(DInfo, OpLoc, isSizeOf, R); 888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 8921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 8971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 9021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 93883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 93983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 94083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 9418a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor NamedDecl *Member, 942d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *ExplicitTemplateArgs, 9438a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor NamedDecl *FirstQualifierInScope) { 944d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 945d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 946d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 9471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 949d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow, 950d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 951d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 952d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 953d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 9541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 95683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 95783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 95883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 95983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 96083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 961017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isArrow? tok::arrow : tok::period, 963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 964017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Member->getDeclName(), 9658a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor ExplicitTemplateArgs, 96683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 9678a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor &SS, 9688a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor FirstQualifierInScope); 969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 9721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 9786ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, 9796ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor LHS.takeAs<Expr>(), RHS.takeAs<Expr>()); 980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 9831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new implicit cast expression. 9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new implicit cast without any semantic analysis. 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, bool isLvalue) { 1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitCastExpr *ICE 10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (getSema().Context) ImplicitCastExpr(T, Kind, 1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)SubExpr.release(), 1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isLvalue); 1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned(ICE); 1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 10091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy, 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy.getAsOpaquePtr(), 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 10241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 10432d1c21414199a7452f122598189363a3922605b1Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::period, AccessorLoc, 10452d1c21414199a7452f122598189363a3922605b1Douglas Gregor DeclarationName(&Accessor), 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1055e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor SourceLocation RBraceLoc, 1056e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor QualType ResultTy) { 1057e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor OwningExprResult Result 1058e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1059e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor if (Result.isInvalid() || ResultTy->isDependentType()) 1060e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1061e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor 1062e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // Patch in the result type we were given, which may have been computed 1063e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor // when the initial InitListExpr was built. 1064e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1065e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor ILE->setType(ResultTy); 1066e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor return move(Result); 1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 10701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 10891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 11031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 11081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 11291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 11681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 11761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 11811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 11931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 11941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 11981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 11991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 12031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 12041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 12051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 12071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 12091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 12101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 12811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 129488650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 129888650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 12991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 13281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 13311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 13361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ThisType) { 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1358f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 13711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ conditional declaration expression. 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc, 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqLoc, 1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var) { 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc, 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EqLoc, 1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var)); 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 14041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 14391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 14431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1448865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS, 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 14561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1468f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier, 1469f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor SourceRange QualifierRange, 1470f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor TemplateName Template, 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TemplateLoc, 1472d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 1473f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange, 1474d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall Template, TemplateLoc, TemplateArgs); 1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 1485ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ 1486ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson SourceLocation(), 1487ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson T, Constructor, IsElidable, 1488f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson move(Args)); 1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1532865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE, 1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1535a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1536a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1538c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1539c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 15400dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult Base = move(BaseE); 1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1542a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1544a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1545a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 15461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, 1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Base), OperatorLoc, OpKind, 1549017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor MemberLoc, 1550017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Name, 1551a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 1552c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor &SS, 1553c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Build a new member reference expression with explicit template 15573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// arguments. 15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1561865d447ac6a4721ab58e898d014a21f2eff74b06John McCall OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE, 15623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow, 15633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 15643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NestedNameSpecifier *Qualifier, 15653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceRange QualifierRange, 15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName Template, 15673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation TemplateNameLoc, 15683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierInScope, 1569d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 15703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult Base = move(BaseE); 15713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: We're going to end up looking up the template based on its name, 15782d1c21414199a7452f122598189363a3922605b1Douglas Gregor // twice! Also, duplicates part of Sema::BuildMemberAccessExpr. 15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor DeclarationName Name; 15803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) 15813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = ActualTemplate->getDeclName(); 15821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (OverloadedFunctionDecl *Ovl 15833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = Template.getAsOverloadedFunctionDecl()) 15843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Ovl->getDeclName(); 1585ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else { 1586ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DependentTemplateName *DTN = Template.getAsDependentTemplateName(); 1587ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1588ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name = DTN->getIdentifier(); 1589ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else 1590ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name = SemaRef.Context.DeclarationNames.getCXXOperatorName( 1591ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor DTN->getOperator()); 1592ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor } 1593d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 1594d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall OperatorLoc, OpKind, 1595d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateNameLoc, Name, 1596d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall &TemplateArgs, 1597d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall Sema::DeclPtrTy(), &SS); 15983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 15991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 16091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 16251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 16361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 16411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 16441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 16460da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor BuiltinLoc); 1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 16481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 166943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 167043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 167143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 167443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 167843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 167943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 168043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 168343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 168543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 168643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 168743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 168843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 168943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1691afe7ec28b1880335daba5f7310fe5191e14c4e76Douglas Gregor return getSema().ActOnExprStmt(getSema().FullExpr(E)); 169243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 16931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 169543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 169643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 16971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1699670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isAddressOfOperand) { 1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1709c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E), \ 1710c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 17121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1715657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1716657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1717657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1720a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1721c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1722c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 17230979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 17240979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 17251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 172643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 17291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1730c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1731c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1736c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1737a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1738c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1741dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1744a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1745a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1746a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1750a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1751c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1752c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 17531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1754dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 17551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 17581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1761dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1763dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1766dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1767dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1769dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1771dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1772dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1773fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 1774dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1775d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1776d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1778dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1779dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1780dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1781dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1785dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1786dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1787dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1789dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1791dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1792dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1793dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 17941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 179581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1796dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 1797dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 179881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 179981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 180081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 180181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 180281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 180381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 180481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 180581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 180681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 180781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 180881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 18091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 181181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 181281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 181381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 1814dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType T; 1815dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor if (!ObjectType.isNull() && 1816dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor isa<TemplateSpecializationType>(Name.getCXXNameType())) { 1817dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TemplateSpecializationType *SpecType 1818dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = cast<TemplateSpecializationType>(Name.getCXXNameType()); 1819dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = TransformTemplateSpecializationType(SpecType, ObjectType); 1820dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor } else 1821dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = getDerived().TransformType(Name.getCXXNameType()); 182281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 182381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 182581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 182781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 182881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 18301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 183181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 183281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 183381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 183481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 18351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 18363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 18373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 18391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 18461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1852d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1860d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl(); 1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 18621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1863d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1865d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1870d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1873d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl); 1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1876d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1878d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1879d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1883d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1884dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 1885dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 1886d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1888ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (DTN->isIdentifier()) 1889ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(), 1890ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1891ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 1892ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getDerived().RebuildTemplateName(NNS, DTN->getOperator(), 1893ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor ObjectType); 1894d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1896d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 18971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1898d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1899d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1900d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 19011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1902d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1903d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1904d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 19051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1906d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1907d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 19081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1909d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl(); 1910d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 19111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1912d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1913d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1914d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 19151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1916d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1917d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1918d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 19191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1920d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransOvl); 1921d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1922d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1923d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 1926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 1928670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1929670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::llvm_unreachable("null template argument in TreeTransform"); 1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 1935833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc)); 1936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1939788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 1940788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(Arg, SourceRange(), Loc); 1941788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor break; 1942788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 1943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 1944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 1948670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 1950828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 1953833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 1954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 1956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 1957833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 1958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 1960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 1961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 1962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 1963833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 1964833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 19651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1966670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1967833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DeclaratorInfo *DI = Input.getSourceDeclaratorInfo(); 1968833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 1969833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = InventDeclaratorInfo(Input.getArgument().getAsType()); 1970833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1971833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 1972833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 1973833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1974833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 1975833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1976670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1978670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1979833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 1980972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 1981972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 1982972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 1983788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), Name); 1984670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1985833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 1986833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1987828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 1988828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 1989828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 1990828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Action::Unevaluated); 1991828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr); 1992828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (E.isInvalid()) 1993828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = NULL; 1994828bff2079b6a91ecd7ed5b842c59527d7682789John McCall else { 1995828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = E.takeAs<Expr>(); 1996828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr->Retain(); 1997828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1998828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1999828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2000828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 2001833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2002670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2004788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: { 2005788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName()); 2006788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateName Template 2007788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor = getDerived().TransformTemplateName(Arg.getAsTemplate()); 2008788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor if (Template.isNull()) 2009788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return true; 2010788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 2011788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Output = TemplateArgumentLoc(TemplateArgument(Template), 2012788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateQualifierRange(), 2013788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor Input.getTemplateNameLoc()); 2014788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return false; 2015788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor } 2016788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 2017670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 2018670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 20191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 2020670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 20211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2022833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 2023833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 2024833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2025833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Sema::OwningExprResult E 2026833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 2027833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 2028833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2029833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *ETaken = E.takeAs<Expr>(); 2030828bff2079b6a91ecd7ed5b842c59527d7682789John McCall ETaken->Retain(); 2031833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken); 2032833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2033670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2035670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 2036670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 2037670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 20381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 2039670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 2040670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 20411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2042833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2043833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2044833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2045828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2046828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2047828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2048828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2049833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2050833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2051828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2052670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2053670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 2055670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 2056828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Result, Input.getLocInfo()); 2057833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2058670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2059670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2061670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2062833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2063670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2064670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2069577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 2071577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 20731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T); 20774802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(DI); 20801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 20831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 2085577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallDeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) { 2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 2090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 20911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 20931bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 2094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 20961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, TL); 2098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TLB.getDeclaratorInfo(SemaRef.Context, Result); 2102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::llvm_unreachable("unhandled type loc!"); 2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 21241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedTypeLoc T) { 2128a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor Qualifiers Quals = T.getType().getLocalQualifiers(); 2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 21391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make 2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work. 2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \ 2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2162a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 216785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType, \ 216885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); \ 2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2172a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \ 2174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setSigilLoc(TL.getSigilLoc()); \ 2175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0) 2178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2180a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BuiltinTypeLoc T) { 2182a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB, 2188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FixedWidthIntTypeLoc T) { 2189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ComplexTypeLoc T) { 2195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointerTypeLoc TL) { 2202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(PointerType); 2203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2204577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 22051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BlockPointerTypeLoc TL) { 2209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(BlockPointerType); 2210a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 221285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 221385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 221485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 221585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 221685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 221785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 221985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc TL) { 222085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 222185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 222285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 222385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 222485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 222585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 222685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 222785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 222885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 222985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 223085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 223185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 223285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 223385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 223485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 223585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 223685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 223785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 223885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 223985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 224085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 224185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 224285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 224385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 224485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 224585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 224685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 224785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 2248a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2251a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall LValueReferenceTypeLoc TL) { 225285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RValueReferenceTypeLoc TL) { 225985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc TL) { 2266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2268a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 228285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 228385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 22941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc TL) { 2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 230985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 231085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 23181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2319a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2332a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc TL) { 2333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 234385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 234485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc TL) { 2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2366670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2367670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2368670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 238485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 23941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayTypeLoc TL) { 2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2407670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2408670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 24091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 242585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 24301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc TL) { 2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2452670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2453670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2454670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2461eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2462eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2485a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc TL) { 2487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2495a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2496a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 25021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2508a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc TL) { 2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 25261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 25301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc TL) { 2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Transform the parameters. 2540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo(); 2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall assert(OldDI->getType() == T->getArgType(i)); 2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(OldDI); 2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewDI == OldDI) 2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = OldParm; 2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else 2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = ParmVarDecl::Create(SemaRef.Context, 2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getDeclContext(), 2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getLocation(), 2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getIdentifier(), 2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI->getType(), 2564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI, 2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getStorageClass(), 2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* DefArg */ NULL); 2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2572a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.push_back(NewType); 2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamDecls.push_back(NewParm); 2582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 25831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2590a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc TL) { 2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc TL) { 2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc TL) { 2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprType *T = TL.getTypePtr(); 2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2655670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2656670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2662a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2665a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 2666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 26701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc TL) { 2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfType *T = TL.getTypePtr(); 2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: should be an inner type, or at least have a DeclaratorInfo. 2683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Underlying.isNull()) 2685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfType(Underlying); 2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 26941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2699577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc TL) { 2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2706670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2707670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 27081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2715a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2719577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2726577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2727577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2728577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc TL) { 2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 2732577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2735577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 27441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2749577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2752a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc TL) { 2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 2755577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2757577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2758577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2762a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2772577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27737da2431c23ef1ee8acb114e39692246e1801afc2John McCall 27747da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc TL) { 2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 27807da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 27817da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 27827da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 27831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2789a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 27967da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 27971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2799577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2800577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2801a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2802a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateTypeParmTypeLoc TL) { 2803a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 2804577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2805577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 28061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 280749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2808a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall SubstTemplateTypeParmTypeLoc TL) { 2810a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 281149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 281249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 281349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2814dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType 2815dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType( 2816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2817a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateSpecializationTypeLoc TL) { 2818833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(TLB, TL, QualType()); 2819833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2820a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2822833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2823833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *TST, 2824833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2825833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: this entire method is a temporary workaround; callers 2826833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // should be rewritten to provide real type locs. 2827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2828833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Fake up a TemplateSpecializationTypeLoc. 2829833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder TLB; 2830833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL 2831833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0)); 2832833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2833828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceLocation BaseLoc = getDerived().getBaseLocation(); 2834828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2835828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setTemplateNameLoc(BaseLoc); 2836828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setLAngleLoc(BaseLoc); 2837828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setRAngleLoc(BaseLoc); 2838833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2839833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &TA = TST->getArg(i); 2840833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc TAL; 2841833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().InventTemplateArgumentLoc(TA, TAL); 2842833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.setArgLocInfo(i, TAL.getLocInfo()); 2843833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2844833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2845833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder IgnoredTLB; 2846833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType); 2847dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 2848dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 2849dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 2850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2851833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 2852833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 2853833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2854833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 2855833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 28561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2857dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2858577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2859577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2861d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo NewTemplateArgs; 2862d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 2863d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 2864d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 2865d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) { 2866d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 2867d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc)) 2868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2869d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs.addArgument(Loc); 2870d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 28711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2872833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 2873833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2874833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 2875833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 2876833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 2877d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NewTemplateArgs); 28781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2879833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 2880833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 2881833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 2882833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 2883833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 2884833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 2885833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 2886833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 2887833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 28881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2889833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 2890577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc TL) { 2896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 2897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2898577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2900577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2901577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2904577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2907a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2908a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2909a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 2910a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 2911a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2913a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2914a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2916a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 2917a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2918a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2919a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2920577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2923a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB, 2924a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc TL) { 2925a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameType *T = TL.getTypePtr(); 2926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /* FIXME: preserve source information better than this */ 2928833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR(TL.getNameLoc()); 2929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR); 2932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 29381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 2939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2945577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, NewTemplateId); 2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR); 2951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2952a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2954a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2955a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result); 2956a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2962a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 2964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCInterfaceTypeLoc TL) { 296554e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCInterfaceType unimplemented"); 296654e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 2967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2970a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2971a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 2972a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCObjectPointerTypeLoc TL) { 297354e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCObjectPointerType unimplemented"); 297454e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 297524fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 297624fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 29831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 298643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 298943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 299243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 299643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 299743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 299943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 300043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 300143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 300243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 30031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 300443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 300543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 300643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 30071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 300843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 300943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 30101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 301143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 301243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 301343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 301443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 301543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 3021264c1f8ec895952466eab59b84b8b06801e721faEli Friedman OwningExprResult LHS(SemaRef), RHS(SemaRef); 3022264c1f8ec895952466eab59b84b8b06801e721faEli Friedman { 3023264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // The case value expressions are not potentially evaluated. 3024264c1f8ec895952466eab59b84b8b06801e721faEli Friedman EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 30251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3026264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the left-hand case value. 3027264c1f8ec895952466eab59b84b8b06801e721faEli Friedman LHS = getDerived().TransformExpr(S->getLHS()); 3028264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (LHS.isInvalid()) 3029264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 30301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3031264c1f8ec895952466eab59b84b8b06801e721faEli Friedman // Transform the right-hand case value (for the GNU case-range extension). 3032264c1f8ec895952466eab59b84b8b06801e721faEli Friedman RHS = getDerived().TransformExpr(S->getRHS()); 3033264c1f8ec895952466eab59b84b8b06801e721faEli Friedman if (RHS.isInvalid()) 3034264c1f8ec895952466eab59b84b8b06801e721faEli Friedman return SemaRef.StmtError(); 3035264c1f8ec895952466eab59b84b8b06801e721faEli Friedman } 30361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 303843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 304143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 304343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 304543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 304643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 305143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 305443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 305843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 306143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 306343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 306643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 306743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 306843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 307143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 307343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 307443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 307543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 307943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 308143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 30841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 30851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 30878cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor OwningExprResult Cond(SemaRef); 30888cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor VarDecl *ConditionVar = 0; 30898cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (S->getConditionVariable()) { 30908cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor ConditionVar 30918cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor = cast_or_null<VarDecl>( 30928cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor getDerived().TransformDefinition(S->getConditionVariable())); 30938cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor if (!ConditionVar) 30948cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor return SemaRef.StmtError(); 30958cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 30968cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getSema().CheckConditionVariable(ConditionVar); 30978cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor } else 30988cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor Cond = getDerived().TransformExpr(S->getCond()); 30998cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 310043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 310143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31028cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor 310343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 31041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 310643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 310743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 311043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 311143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 311243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 311343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 311543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 311643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 311743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 311843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 31191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then), 31221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 312443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 312543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 312843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 313143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond)); 313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 314443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 314543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 315143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 315243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 315343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 315443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 31571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 315943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 316043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 316543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body)); 316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 317243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 317343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 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 body 318043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 318243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 320043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 320343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 320843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 321043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 321243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 321343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 321443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 321543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 321743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 321843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 321943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 322043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 322143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 32221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 322543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Init), move(Cond), move(Inc), 322643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 322743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 32301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 32311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 32331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 323443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 323843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 324143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 32461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 324743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 324843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 325043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 325143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 325343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 32551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 325643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 325943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 326243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 326743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 32711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 327243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 327443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 327743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 328043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 328343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 328843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 32891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 329143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 32921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 32941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 33041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 330643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 330943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 331343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 331543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 331643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 331743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 331943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 332243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 332443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 332543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 332743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 332943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 333543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 33371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 333843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 334143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 33421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 334343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 33451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 334643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 33511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 33541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 335743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 33631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 336643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 337043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 337443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 338343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclaratorInfo(), 338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 339843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 340343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 34061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 341043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 341143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 341443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 341943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 342343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 34261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 34301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 34341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 34381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 34411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 34431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 3445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 3446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 34471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3449c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E, 3450c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3456c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E, 3457c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3458a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3459a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 3460a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3461a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor E->getQualifierRange()); 3462a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 3463a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3464a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3465a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 34661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *ND 3467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3471a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 3472a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 3473a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 3474a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor !E->hasExplicitTemplateArgumentList()) 34751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3477a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: We're losing the explicit template arguments in this transformation. 3478a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3479833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs()); 3480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3481833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], 3482833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransArgs[I])) 3483a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3484a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3485a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3486a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: Pass the qualifier/qualifier range along. 3487a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 3488c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ND, E->getLocation(), 3489c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 3490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3494c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E, 3495c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3501c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E, 3502c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3508c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E, 3509c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3515c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E, 3516c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3522c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E, 3523c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3529c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformParenExpr(ParenExpr *E, 3530c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 35421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3544c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E, 3545c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3546c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr(), 3547c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor E->getOpcode() == UnaryOperator::AddrOf); 3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 35521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3561c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E, 3562c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 35645ab75172051a6d2ea71a80a79e81c65519fd3462John McCall DeclaratorInfo *OldT = E->getArgumentTypeInfo(); 35655557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 35665ab75172051a6d2ea71a80a79e81c65519fd3462John McCall DeclaratorInfo *NewT = getDerived().TransformType(OldT); 35675ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!NewT) 3568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35705ab75172051a6d2ea71a80a79e81c65519fd3462John McCall if (!getDerived().AlwaysRebuild() && OldT == NewT) 3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35735ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(), 35741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 35841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3600c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E, 3601c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3624c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E, 3625c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 36431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 36541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3664c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E, 3665c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 367083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 367183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 36721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 367383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 367483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange()); 3675c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 367683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 367783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 36781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *Member 3680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 368683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 36878a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member == E->getMemberDecl() && 36888a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor !E->hasExplicitTemplateArgumentList()) 36891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3691d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs; 36928a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor if (E->hasExplicitTemplateArgumentList()) { 3693d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setLAngleLoc(E->getLAngleLoc()); 3694d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.setRAngleLoc(E->getRAngleLoc()); 36958a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3696d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 3697d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 36988a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor return SemaRef.ExprError(); 3699d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 37008a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 37018a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor } 37028a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor 3703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 370983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 371083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 37128a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor Member, 3713d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall (E->hasExplicitTemplateArgumentList() 3714d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall ? &TransArgs : 0), 37158a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor 0); 3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3720c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCastExpr(CastExpr *E, 3721c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 37231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3728c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E, 3729c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 37411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 37471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3750c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CompoundAssignOperator *E, 3751c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3752c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformBinaryOperator(E, isAddressOfOperand); 3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3757c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E, 3758c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 377847e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 37791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 378047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 37851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3786c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E, 3787c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 37885557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 37895557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 37905557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have type information here? It seems like we won't, 37915557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // so do we even need to transform the type? 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 38031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 38061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isLvalueCast()); 3808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3812c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E, 3813c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 38151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3820c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E, 3821c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getTypeAsWritten()); 3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3850c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E, 3851c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 38551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeTypeLoc 3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 38581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 38711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3880c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E, 3881c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 38881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3900c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E, 3901c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 39031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 39151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3918e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor E->getRBraceLoc(), E->getType()); 3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3923c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E, 3924c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 39261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 392743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 39521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 39721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 39751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 3993c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ImplicitValueInitExpr *E, 3994c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 39955557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 39965557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 39975557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 39985557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4012c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E, 4013c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 4015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 40161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4040c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E, 4041c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4065c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E, 4066c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4072c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult 4073c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E, 4074c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 40751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4091c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E, 4092c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 40971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 41101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4118c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E, 4119c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 41361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4145c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E, 4146c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 41471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4152c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E, 4153c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4158c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor OwningExprResult First 4159c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor = getDerived().TransformExpr(E->getArg(0), 4160c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor E->getNumArgs() == 1 && E->getOperator() == OO_Amp); 4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 41741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 41751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 41791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 4181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4186c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E, 4187c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4188c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCallExpr(E, isAddressOfOperand); 4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4193c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E, 4194c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 41981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 42011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 42141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 42171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 42241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 4225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4235c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E, 4236c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4237c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4242c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E, 4243c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4244c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 4250c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXReinterpretCastExpr *E, 4251c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4252c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4257c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E, 4258c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4259c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand); 4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 4265c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXFunctionalCastExpr *E, 4266c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 42701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4296c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E, 4297c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 43181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 43201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 43271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 43361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4337c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E, 4338c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 43391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 4345c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXNullPtrLiteralExpr *E, 4346c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 43471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4352c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E, 4353c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 43551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4369c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E, 4370c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 43771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4384c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E, 4385c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 43861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(Param); 4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4400c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E, 4401c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 44101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4420c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E, 4421c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 44221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *Var 442343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl())); 4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Var) 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 44281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Var == E->getVarDecl()) 4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(), 4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getStartLoc(), 4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var); 4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4438c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E, 4439c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 446343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 44781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 44921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4497c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E, 4498c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 4500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 45041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Operand.get() == E->getArgument()) 45051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 4511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4515a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 4516c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXPseudoDestructorExpr *E, 4517c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4518a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4519a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 4520a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 45211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4522a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 4523a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4524a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4525a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 4526a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 45271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4528a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 4529a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 4530a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 4531a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 4532a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 4533a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 4534a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 45351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4536a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 4537a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 4538a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 4539a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 4540a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 45411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4542a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 4543a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 4544a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 4545a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 4546a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 4547a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 4548a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4549a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 45501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4551a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 4552a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 4553ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr( 4554ba13543329afac4a0d01304ec2ec4924d99306a6John McCall UnresolvedLookupExpr *E, 4555c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4556ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // There is no transformation we can apply to an unresolved lookup. 45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4562c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E, 4563c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 45651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 4567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 45731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 45771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 4579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 4580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 4581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4587865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 4588865d447ac6a4721ab58e898d014a21f2eff74b06John McCall DependentScopeDeclRefExpr *E, 4589c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4591f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4592f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 459781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 459881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 459981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 46001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 4602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 4603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name == E->getDeclName()) 46041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 46051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4606865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildDependentScopeDeclRefExpr(NNS, 4607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 4608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 4610c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor isAddressOfOperand); 4611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4615c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E, 4616c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4617fd2300e1ee0eab6c51862a92d3f3c72540b36b23Douglas Gregor TemporaryBase Rebase(*this, E->getTemplateNameLoc(), DeclarationName()); 4618fd2300e1ee0eab6c51862a92d3f3c72540b36b23Douglas Gregor 46191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateName(E->getTemplateName()); 4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Template.isNull()) 4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4624f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4625f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor if (E->getQualifier()) { 4626f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4627f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4628f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor if (!Qualifier) 4629f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return SemaRef.ExprError(); 4630f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 4631d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 4632d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4634d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4635d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4637d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Would like to avoid rebuilding if nothing changed, but we can't 4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // compare template arguments (yet). 46421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: It's possible that we'll find out now that the template name 4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // actually refers to a type, in which case the caller is actually dealing 4645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // with a functional cast. Give a reasonable error message! 4646f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(), 4647f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Template, E->getTemplateNameLoc(), 4648d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs); 4649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4653c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E, 4654c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 46691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 46921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to 46931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the 4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself 4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique. 4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4698c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E, 4699c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 47101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new 47111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the 4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the 4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression. 4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 4717c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXExprWithTemporaries *E, 4718c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned( 4724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->shouldDestroyTemporaries())); 4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 4731c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXTemporaryObjectExpr *E, 4732c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 47471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 47571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 47631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 47681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 4782c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor CXXUnresolvedConstructExpr *E, 4783c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 48081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4821865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 4822865d447ac6a4721ab58e898d014a21f2eff74b06John McCall CXXDependentScopeMemberExpr *E, 4823c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48296cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Start the member reference and compute the object's type. 4830a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Sema::TypeTy *ObjectType = 0; 48311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4832a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getOperatorLoc(), 4833a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4834a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType); 4835a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (Base.isInvalid()) 4836a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 48371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48386cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 48396cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 4840c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 48416cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 48426cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 48436cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 48441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4845a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4846a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4847a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4848a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4849c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType::getFromOpaquePtr(ObjectType), 4850c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 4851a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4852a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4853a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 48541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 4856dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 4857dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 485881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 485981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 48601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!E->hasExplicitTemplateArgumentList()) { 48623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 48633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 48643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 48653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Base.get() == E->getBase() && 48663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 48673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 48683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 48691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4871865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 48723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 48733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 48743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 48753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 48763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 48773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 48783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope); 48793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 48803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 48813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This is an ugly hack, which forces the same template name to 48823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // be looked up multiple times. Yuck! 4883ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemporaryBase Rebase(*this, E->getMemberLoc(), DeclarationName()); 4884ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor TemplateName OrigTemplateName; 4885ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) 4886ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OrigTemplateName = SemaRef.Context.getDependentTemplateName(0, II); 4887ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor else 4888ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OrigTemplateName 4889ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor = SemaRef.Context.getDependentTemplateName(0, 4890ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.getCXXOverloadedOperator()); 48911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 48931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getDerived().TransformTemplateName(OrigTemplateName, 48943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 48953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (Template.isNull()) 48963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 48971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4898d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 48993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4900d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc Loc; 4901d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc)) 49023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 4903d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs.addArgument(Loc); 49043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 49051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4906865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base), 4907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4909a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4910a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 49113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Template, 4912c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor E->getMemberLoc(), 49133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 4914d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TransArgs); 4915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4919c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E, 4920c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 49211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4926c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E, 4927c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 4929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 4930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 4931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 4932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 49331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 49361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 4939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 4940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4945c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E, 4946c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4954c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E, 4955c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 49561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4961c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E, 4962c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 49631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 4964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 4965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 4966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 4967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 49711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 49721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 4975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 49781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4983c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E, 4984c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4992c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E, 4993c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 49961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 500109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 5002c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor ObjCImplicitSetterGetterRefExpr *E, 5003c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 50061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5011c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E, 5012c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 50151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5020c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E, 5021c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 50241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5029c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E, 5030c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 5032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 5033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 5034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 5036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 5039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 5040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 50411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 5043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 50441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 50451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 5047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 5048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 5049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5053c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E, 5054c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 50571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5062c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E, 5063c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor bool isAddressOfOperand) { 5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 5065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 50661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 5067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 50681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 5071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 507485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 507585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 507685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star, 5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 508185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 508285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 508385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star, 5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 5085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 508985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 509085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 509185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 509285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(), 509385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 50961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 50971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 509885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 509985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 510085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 51010953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 510285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 5103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 510785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType, 510885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 510985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil, 5110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseEntity()); 5111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 5115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 5116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 5118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 5119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 5121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 5122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 5123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 5124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 51251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 51271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 51281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 51291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 5130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 5131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 5132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 5133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 5134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 5135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 5136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 5137577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 51381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5139577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeType.isNull()) 5140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 51411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5142577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 51431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 5144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 51451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 5146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5148577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 5151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 515385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 515485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 51551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 515685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5157577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5158577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 5162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 516385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 516485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 51651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 516685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 5172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 51761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 51821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 51831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 5184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 51881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 5195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 5196577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 5197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 5198577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5200577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 5202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 5203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5204577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 5205577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 5206577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 52071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 5208577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 5210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 52141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 52151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 5216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 5219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 52231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 5224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 52251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 5226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 52271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 5228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 5229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 5230577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 5231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 5235a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 5236a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5238a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 5240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 5241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 5245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 5246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 5250577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 5251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 5255833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 5256833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 5257d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &TemplateArgs) { 5258d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 5259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 52601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5261dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5262dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5263dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5264dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5265a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 5266c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 5267d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NamedDecl *FirstQualifierInScope) { 5268dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 5269dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 5270dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 5271dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 5272dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 52731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 5274495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 5275c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 5276c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 5277495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor false)); 5278dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5279dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5280dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5281dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5282dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5283dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5284dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 5285dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 5286dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5287dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5288dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5289dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5290dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5291dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5292dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 5293dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 5294dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 5295dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 5296a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here"); 5297dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 5298dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 5299dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 53001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5301dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 5302dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 5303dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 53041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5305d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 53061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5307d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5308d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5309d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 53101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 5311d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 5312d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5313d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5314d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 53151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5316d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5317d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5318d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl) { 5319d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl); 5320d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5321d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5322d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 53231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5324d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 53253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 53263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 5327d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 5328d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 53291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 5330014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor UnqualifiedId Name; 5331014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation()); 53323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 53333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 53343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 5335014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor Name, 5336a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5337a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 53383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 5339d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 53401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 5342ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName 5343ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5344ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor OverloadedOperatorKind Operator, 5345ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor QualType ObjectType) { 5346ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor CXXScopeSpec SS; 5347ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 5348ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS.setScopeRep(Qualifier); 5349ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor UnqualifiedId Name; 5350ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SourceLocation SymbolLocations[3]; // FIXME: Bogus location information. 5351ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(), 5352ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Operator, SymbolLocations); 5353ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor return getSema().ActOnDependentTemplateName( 5354ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 5355ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor SS, 5356ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor Name, 5357a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor ObjectType.getAsOpaquePtr(), 5358a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor /*EnteringContext=*/false) 5359ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor .template getAsVal<TemplateName>(); 5360ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor} 5361ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor 5362ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived> 53631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 5365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 5366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 5367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 5368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 5369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 5370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 5371ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts(); 5372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 53731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 5375f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 5376f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (!FirstExpr->getType()->isOverloadableType() && 5377f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl !SecondExpr->getType()->isOverloadableType()) 5378f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return getSema().CreateBuiltinArraySubscriptExpr(move(First), 5379ba13543329afac4a0d01304ec2ec4924d99306a6John McCall CalleeExpr->getLocStart(), 5380f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(Second), OpLoc); 53811a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman } else if (Op == OO_Arrow) { 53821a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman // -> is never a builtin operation. 53831a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc); 5384f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl } else if (SecondExpr == 0 || isPostIncDec) { 5385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 5386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 53881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 53901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 5392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 53941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 5395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 5396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 5397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 5398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 53991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 5401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 54031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 5406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 5407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 54091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 5411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 5412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 54131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5414ba13543329afac4a0d01304ec2ec4924d99306a6John McCall if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) { 5415ba13543329afac4a0d01304ec2ec4924d99306a6John McCall assert(ULE->requiresADL()); 5416ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 5417ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // FIXME: Do we have to check 5418ba13543329afac4a0d01304ec2ec4924d99306a6John McCall // IsAcceptableNonMemberOperatorCandidate for each of these? 5419ba13543329afac4a0d01304ec2ec4924d99306a6John McCall for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(), 5420ba13543329afac4a0d01304ec2ec4924d99306a6John McCall E = ULE->decls_end(); I != E; ++I) 5421ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Functions.insert(AnyFunctionDecl::getFromNamedDecl(*I)); 5422ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } else { 5423ba13543329afac4a0d01304ec2ec4924d99306a6John McCall Functions.insert(AnyFunctionDecl::getFromNamedDecl( 5424ba13543329afac4a0d01304ec2ec4924d99306a6John McCall cast<DeclRefExpr>(CalleeExpr)->getDecl())); 5425ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 54261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 5428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 5429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 54301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName OpName 5431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 5432644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs, 5433644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl Functions); 54341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 5436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 54371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 5439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 5440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 54411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5442f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 5443ba13543329afac4a0d01304ec2ec4924d99306a6John McCall return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(), 5444ba13543329afac4a0d01304ec2ec4924d99306a6John McCall OpLoc, 5445ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(First), 5446ba13543329afac4a0d01304ec2ec4924d99306a6John McCall move(Second)); 5447f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 5448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 54491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 5450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 54511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 5453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 54551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 54581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 5459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 54601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 5462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 5464