TreeTransform.h revision 3b6afbb99a1c44b4076f8e15fb7311405941b306
1577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===------- TreeTransform.h - Semantic Tree Transformation ---------------===/ 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" 25b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h" 26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h" 27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h" 28577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm> 29577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang { 31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one 33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another. 34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// A new tree transformation is defined by creating a new subclass \c X of 36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TreeTransform<X> and then overriding certain operations to provide 37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// behavior specific to that transformation. For example, template 38577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the 39577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the 40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar 41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and 42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters. 43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow 45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// subclasses to customize any of its operations. Thus, a subclass can 46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an 47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The 48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual. 49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which 51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node 52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions, 53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST 54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation 55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g., 56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes 57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create 58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node. 59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Subclasses can customize the transformation at various levels. The 61670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(), 62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(), 63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely 64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations. 65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the 67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 6843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation 70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// to substitute template arguments for their corresponding template 71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX 72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change. 73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild 74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may 75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps. 76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one 78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// to avoid traversing nodes that don't need any transformation 79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the 81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking 82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()). 83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform { 85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected: 86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &SemaRef; 87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorpublic: 89b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningStmtResult OwningStmtResult; 90b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningExprResult OwningExprResult; 91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::StmtArg StmtArg; 92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::ExprArg ExprArg; 93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::MultiExprArg MultiExprArg; 9443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor typedef Sema::MultiStmtArg MultiStmtArg; 95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 96577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Initializes a new tree transformer. 97577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Derived &getDerived() { return static_cast<Derived&>(*this); } 101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const Derived &getDerived() const { 104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return static_cast<const Derived&>(*this); 105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the semantic analysis object used for 108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this tree transform. 109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &getSema() const { return SemaRef; } 110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Whether the transformation should always rebuild AST nodes, even 112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// if none of the children have changed. 113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function to specify when the transformation 115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// should rebuild all AST nodes. 116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlwaysRebuild() { return false; } 117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the location of the entity being transformed, if that 119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns no source-location information. Subclasses can 122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// provide an alternative implementation that provides better location 123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information. 124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation getBaseLocation() { return SourceLocation(); } 125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the name of the entity being transformed, if that 127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns an empty name. Subclasses can provide an alternative 130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// implementation with a more precise name. 131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor DeclarationName getBaseEntity() { return DeclarationName(); } 132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Sets the "base" location and entity when that 134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// information is known based on another transformation. 135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, the source location and entity are ignored. Subclasses can 137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// override this function to provide a customized implementation. 138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor void setBase(SourceLocation Loc, DeclarationName Entity) { } 139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief RAII object that temporarily sets the base location and entity 141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// used for reporting diagnostics in types. 142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor class TemporaryBase { 143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TreeTransform &Self; 144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OldLocation; 145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OldEntity; 146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor public: 148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase(TreeTransform &Self, SourceLocation Location, 149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Entity) : Self(Self) 150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldLocation = Self.getDerived().getBaseLocation(); 152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldEntity = Self.getDerived().getBaseEntity(); 153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(Location, Entity); 154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ~TemporaryBase() { 157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(OldLocation, OldEntity); 158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor }; 160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Determine whether the given type \p T has already been 162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformed. 163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses can provide an alternative implementation of this routine 165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// to short-circuit evaluation when it is known that a given type will 166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not change. For example, template instantiation need not traverse 167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// non-dependent types. 168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlreadyTransformed(QualType T) { 169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.isNull(); 170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transforms the given type into another type. 173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, this routine transforms a type by delegating to the 175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// appropriate TransformXXXType to build a new type, then applying 176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// the qualifiers on \p T to the resulting type with AddTypeQualifiers. 177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function (to take over all type 178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformations), some set of the TransformXXXType functions, or 179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// the AddTypeQualifiers function to alter the transformation. 180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \returns the transformed type. 182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType TransformType(QualType T); 183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given type by adding the given set of qualifiers 185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// and returning the result. 186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// FIXME: By default, this routine adds type qualifiers only to types that 188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// can have qualifiers, and silently suppresses those qualifiers that are 189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not permitted (e.g., qualifiers on reference or function types). This 190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// is the right thing for template instantiation, but probably not for 191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// other clients. 192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType AddTypeQualifiers(QualType T, unsigned CVRQualifiers); 193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 194657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 19643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, this routine transforms a statement by delegating to the 19743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// appropriate TransformXXXStmt function to transform a specific kind of 19843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// statement or the TransformExpr() function to transform an expression. 19943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to transform statements using some 20043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// other mechanism. 20143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 20243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \returns the transformed statement. 203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformStmt(Stmt *S); 204657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 205657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 206657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E) { 214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false); 215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Transform the given expression. 218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand); 226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 230dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 231dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 232dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Decl *TransformDecl(Decl *D) { return D; } 23343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 23443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Transform the definition of the given declaration. 23543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 23643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, invokes TransformDecl() to transform the declaration. 23743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 23843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); } 239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 242dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, transforms all of the types and declarations within the 243dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 244dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 246a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 247c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType = QualType(), 248c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 25081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 25181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 25281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 25381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 25481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 25581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 25681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName TransformDeclarationName(DeclarationName Name, 25781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SourceLocation Loc); 25881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 261d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 262d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// and nested-name-specifiers that occur within the template name. 263d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 2643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName TransformTemplateName(TemplateName Name, 2653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType = QualType()); 266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 269670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// By default, this operation transforms the type, expression, or 270670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// declaration stored within the template argument and constructs a 271670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 272670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg); 274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT) 276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT) \ 277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Transform##CLASS##Type(const CLASS##Type *T); 278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "clang/AST/TypeNodes.def" 279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 28043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 28243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 28343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Transform##Node(Node *E); 286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildPointerType(QualType PointeeType); 294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the block pointer 298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildBlockPointerType(QualType PointeeType); 300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new lvalue reference type given the type it references. 302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the lvalue reference 304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildLValueReferenceType(QualType ReferentType); 306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new rvalue reference type given the type it references. 308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the rvalue reference 310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRValueReferenceType(QualType ReferentType); 312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType); 319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Also by default, all of the other Rebuild*Array 327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildConstantArrayType(QualType ElementType, 340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, size expression, and index type 346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildConstantArrayWithExprType(QualType ElementType, 351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildConstantArrayWithoutExprType(QualType ElementType, 363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildIncompleteArrayType(QualType ElementType, 373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new variable-length array type given the element type, 377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVariableArrayType(QualType ElementType, 382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new dependent-sized array type given the element type, 388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildDependentSizedArrayType(QualType ElementType, 393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVectorType(QualType ElementType, unsigned NumElements); 404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new potentially dependently-sized extended vector type 414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildDependentSizedExtVectorType(QualType ElementType, 419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType *ParamTypes, 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4457da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4467da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4477da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 4487da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 4497da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typeof(expr) type. 452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typeof(type) type. 458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new C++0x decltype type. 463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateArgument *Args, 475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumArgs); 476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new QualifiedNameType type from the 480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// nested-name-specifier and the named type. Subclasses may override 481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// and the given type. Subclasses may override this routine to provide 490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypenameType(NNS, 494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// (or qualified name type). Subclasses may override this routine to provide 503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, 505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const IdentifierInfo *Id) { 506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.CheckTypenameType(NNS, *Id, 507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange(getDerived().getBaseLocation())); 508dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 509dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 511dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 512dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 513dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 516dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 517dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 518a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 519c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 520c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 521dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 522dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 523dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 524dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 525dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 526dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 527dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 528dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 529dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 530dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 533dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 534dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 535dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 536dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 537dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 538dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 539dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 540dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 541dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 542d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 543d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 544d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 545d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 546d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 547d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 548d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 549d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 550d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 551d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 552d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 553d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 554d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and a set of 555d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// overloaded function templates. 556d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 557d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 558d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 559d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 560d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 561d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl); 562d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 563d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 564d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 565d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 566d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 567d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 568d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 569d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 570d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 5713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 5723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 57543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 57643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 57743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 57843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 57943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 58043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 58143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 58243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 58343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 58443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 58543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 58643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 58743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 58843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 58943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 59043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 59143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 59243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 59343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 59443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 59543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 59643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 59743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 59843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 59943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 60043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 60143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 60243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 60343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 60443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 60543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 60643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 60743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 60843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Then, SourceLocation ElseLoc, 63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Else) { 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else)); 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch 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 RebuildSwitchStmtStart(ExprArg Cond) { 64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnStartOfSwitchStmt(move(Cond)); 64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body)); 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 66943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for 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 RebuildForStmt(SourceLocation ForLoc, 68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Init, ExprArg Cond, ExprArg Inc, 68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond), 69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Inc), RParenLoc, move(Body)); 69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StartLoc, 73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclaratorInfo *Declarator, 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) { 778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildDeclarationNameExpr(Loc, ND, 779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false, 780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*SS=*/0, 781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 793a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 794a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// 795a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 796a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 797a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 798a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 799a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 800a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation DestroyedTypeLoc, 801a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType, 802a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier, 803a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceRange QualifierRange) { 804a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXScopeSpec SS; 805a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Qualifier) { 806a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setRange(QualifierRange); 807a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setScopeRep(Qualifier); 808a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 809a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 810a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DeclarationName Name 811a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 812a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType)); 813a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 814a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 815a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OperatorLoc, 816a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor isArrow? tok::arrow : tok::period, 817a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedTypeLoc, 818a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Name, 819a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Sema::DeclPtrTy::make((Decl *)0), 820a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor &SS); 821a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 822a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr)); 831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc, 838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R); 840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with an expression 843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LBracketLoc, move(RHS), 869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 88983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor bool isArrow, 89083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 89183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 89283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *Member) { 894d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 895d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 896d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 897d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 898d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson MemberExpr *ME = 899d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow, 900d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 901d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 902d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 903d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 904d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 90583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 90683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 90783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 90883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 90983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 91083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 911017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isArrow? tok::arrow : tok::period, 913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 914017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Member->getDeclName(), 91583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 91683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor &SS); 917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(), 928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)RHS.get()); 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.release(); 933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.release(); 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new implicit cast expression. 951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new implicit cast without any semantic analysis. 953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, bool isLvalue) { 956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitCastExpr *ICE 957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (getSema().Context) ImplicitCastExpr(T, Kind, 958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)SubExpr.release(), 959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isLvalue); 960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned(ICE); 961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy, 969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy.getAsOpaquePtr(), 974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::period, AccessorLoc, 1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Accessor, 1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBraceLoc) { 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis, using the name of the label 1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// operator call into a use of a builtin operator, performing 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "named" cast expression, such as static_cast or 1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc, LParenLoc, 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc, LParenLoc, 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc, LParenLoc, 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc, LParenLoc, 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 123988650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 124388650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*CommaLocs=*/0, 1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// semantic analysis. Subclasses may override this routine to provide 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ThisType) { 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1303f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), LParenLoc, 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg(getSema(), 0, 0), 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ conditional declaration expression. 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc, 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqLoc, 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var) { 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc, 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EqLoc, 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var)); 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ParenTypeId, 1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildCXXNew(StartLoc, UseGlobal, 1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait 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. 1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new qualified declaration reference expression. 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS, 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *ND, 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND->getDeclName(), 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new (previously unresolved) declaration reference 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS, 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTemplateIdExpr(TemplateName Template, 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TemplateLoc, 1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgument *TemplateArgs, 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumTemplateArgs, 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc) { 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildTemplateIdExpr(Template, TemplateLoc, 1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgs, NumTemplateArgs, 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc); 1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 1453ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ 1454ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson SourceLocation(), 1455ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson T, Constructor, IsElidable, 1456f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson move(Args)); 1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 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 RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15000dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1503a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1504a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1506c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1507c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 15080dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult Base = move(BaseE); 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1510a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1512a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1513a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 1514a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 15153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Base), OperatorLoc, OpKind, 1517017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor MemberLoc, 1518017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Name, 1519a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 1520c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor &SS, 1521c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 15243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Build a new member reference expression with explicit template 15253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// arguments. 15263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15273b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15283b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 15303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow, 15313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 15323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NestedNameSpecifier *Qualifier, 15333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceRange QualifierRange, 15343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName Template, 15353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation TemplateNameLoc, 15363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierInScope, 15373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation LAngleLoc, 15383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const TemplateArgument *TemplateArgs, 15393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor unsigned NumTemplateArgs, 15403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation RAngleLoc) { 15413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult Base = move(BaseE); 15423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 15433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 15443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 15483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: We're going to end up looking up the template based on its name, 15493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr. 15503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor DeclarationName Name; 15513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) 15523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = ActualTemplate->getDeclName(); 15533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor else if (OverloadedFunctionDecl *Ovl 15543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = Template.getAsOverloadedFunctionDecl()) 15553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Ovl->getDeclName(); 15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor else 15573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Template.getAsDependentTemplateName()->getName(); 15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OperatorLoc, OpKind, 15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateNameLoc, Name, true, 15623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor LAngleLoc, TemplateArgs, 15633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NumTemplateArgs, RAngleLoc, 15643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Sema::DeclPtrTy(), &SS); 15653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor const IdentifierInfo &Name 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Callee 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BuiltinLoc, false, false); 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build the CallExpr 1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 163543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 163643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 163743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 163843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 163943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 164043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 164143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 164243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 164343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 164443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 164543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 164643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 164743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 164843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 164943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 165043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 165143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 165243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 165343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 165443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 165543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 165643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned(E.takeAs<Stmt>()); 165943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 166043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 166143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 166243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 166343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 166443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 1665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1666670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isAddressOfOperand) { 1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1681657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1682657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1683657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1684dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1685dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1686a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1687c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1688c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 16890979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 16900979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 16910979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor 169243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1693dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1694dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 1695a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1696c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1697c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1699dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 1700a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 1701c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // Clear out the object type and the first qualifier in scope; they only 1702c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1703a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1704c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 1709a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor assert((Prefix || !ObjectType.isNull()) && 1710a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1711a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1712a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1713dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 1714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1716a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1717c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1718c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS 1722dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1723dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 1724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1726dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1731dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1734dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 1736dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1737dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1740d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1741d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 1742d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1744dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1754dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 1756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1758dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 175981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorDeclarationName 176081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 176181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SourceLocation Loc) { 176281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 176381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 176481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 176581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 176681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 176781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 176881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 176981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 177081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 177181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 177281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 177381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 177481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 177581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 177681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 177781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 177881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor QualType T = getDerived().TransformType(Name.getCXXNameType()); 177981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 178081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 178181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 178281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 178381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor Name.getNameKind(), 178481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 178581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 178681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 178981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 179081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 1792d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName 17933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 17943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1795d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 1796d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NestedNameSpecifier *NNS 1797d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1798d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1799d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1800d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1801d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1802d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 1803d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *TransTemplate 1804d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1805d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1806d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1807d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1808d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1809d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1810d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1811d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1812d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1813d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1814d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1815d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 1816d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1817d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl(); 1818d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 1819d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *TransOvl 1820d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1821d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1822d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1824d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1826d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl); 1831d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 1832d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NestedNameSpecifier *NNS 1835d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == DTN->getQualifier()) 1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 18443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType); 1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *TransTemplate 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1850d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1852d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1860d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl(); 1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *TransOvl 1863d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1865d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1870d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransOvl); 1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1873d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1875670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTemplateArgument 1876670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) { 1877670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1878670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 1879670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1880670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return Arg; 1881670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1882670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1883670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor QualType T = getDerived().TransformType(Arg.getAsType()); 1884670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (T.isNull()) 1885670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1886670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(Arg.getLocation(), T); 1887670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1888670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1889670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1890670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1891670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (!D) 1892670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1893670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(Arg.getLocation(), D); 1894670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1895670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1896670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 1897670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 1898670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(getSema(), 1899670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 1900670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1901670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr()); 1902670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (E.isInvalid()) 1903670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1904670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(E.takeAs<Expr>()); 1905670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1906670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1907670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 1908670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 1909670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 1910670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 1911670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 1912670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 1913670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument TA = getDerived().TransformTemplateArgument(*A); 1914670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (TA.isNull()) 1915670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TA; 1916670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1917670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.push_back(TA); 1918670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1919670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 1920670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 1921670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 1922670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return Result; 1923670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1924670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1925670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1926670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 1927670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1928670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 1929670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 1931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 1932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 1933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 1936577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 1937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 1938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Result; 1940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor switch (T->getTypeClass()) { 1941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT) 1942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT) \ 1943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor case Type::CLASS: \ 1944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Result = getDerived().Transform##CLASS##Type( \ 1945577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor static_cast<CLASS##Type*>(T.getTypePtr())); \ 1946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 1947577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "clang/AST/TypeNodes.def" 1948577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 1949577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1950577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Result.isNull() || T == Result) 1951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return Result; 1952577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().AddTypeQualifiers(Result, T.getCVRQualifiers()); 1954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1958577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::AddTypeQualifiers(QualType T, unsigned CVRQualifiers) { 1959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (CVRQualifiers && !T->isFunctionType() && !T->isReferenceType()) 1960577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.getWithAdditionalQualifiers(CVRQualifiers); 1961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 1963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19641bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 1965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformExtQualType(const ExtQualType *T) { 1967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 1968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) { 1973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // Nothing to do 1974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1978577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFixedWidthIntType( 1979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const FixedWidthIntType *T) { 1980577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 1981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1982577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) { 1986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 1987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1990577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1991577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) { 1992577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1993577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1996577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1997577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 1998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2000577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildPointerType(PointeeType); 2001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2002577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 2005577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) { 2006577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2007577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2008577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 2012577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildBlockPointerType(PointeeType); 2015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2016577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2018577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 2019577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformLValueReferenceType( 2020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const LValueReferenceType *T) { 2021577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2026577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 2027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildLValueReferenceType(PointeeType); 2030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformRValueReferenceType( 2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const RValueReferenceType *T) { 2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2039577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2040577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2041577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 2042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildRValueReferenceType(PointeeType); 2045577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 2049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) { 2050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2052577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0)); 2055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2058577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType() && 2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ClassType == QualType(T->getClass(), 0)) 2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2062577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildMemberPointerType(PointeeType, ClassType); 2064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) { 2069577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2071577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildConstantArrayType(ElementType, 2078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSize(), 2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier()); 2081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 2085577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayWithExprType( 2086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const ConstantArrayWithExprType *T) { 2087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2088577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2090577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2091670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2092670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2093670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2094670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2095670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (Size.isInvalid()) 2096670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return QualType(); 2097670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2099670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor ElementType == T->getElementType() && 2100670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Size.get() == T->getSizeExpr()) 2101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildConstantArrayWithExprType(ElementType, 2104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSize(), 2106670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Size.takeAs<Expr>(), 2107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier(), 2108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getBracketsRange()); 2109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 2113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayWithoutExprType( 2114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const ConstantArrayWithoutExprType *T) { 2115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildConstantArrayWithoutExprType(ElementType, 2124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSize(), 2126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier()); 2127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const IncompleteArrayType *T) { 2132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2137577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2138577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2139577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildIncompleteArrayType(ElementType, 2141577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2142577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier()); 2143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVariableArrayType( 2147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const VariableArrayType *T) { 2148577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2152670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2153670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2154670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2155577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2156577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2157577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2158577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 2161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 2162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 2163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildVariableArrayType(ElementType, 2167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier(), 2170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getBracketsRange()); 2171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedArrayType( 2175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const DependentSizedArrayType *T) { 2176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2180670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2181670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2182670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 2189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 2190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 2191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildDependentSizedArrayType(ElementType, 2195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2196577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier(), 2198577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getBracketsRange()); 2199577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2200577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const DependentSizedExtVectorType *T) { 2204577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2205577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2206577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2207577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2208670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2209670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2210670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2212577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 2217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 2218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 2219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildDependentSizedExtVectorType(ElementType, 2223577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) { 2229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2230577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 2242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) { 2243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2250577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(), 2252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /*FIXME*/SourceLocation()); 2253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2255577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionProtoType( 2257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const FunctionProtoType *T) { 2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ResultType = getDerived().TransformType(T->getResultType()); 2259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(), 2264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ParamEnd = T->arg_type_end(); 2265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Param != ParamEnd; ++Param) { 2266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType P = getDerived().TransformType(*Param); 2267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (P.isNull()) 2268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ParamTypes.push_back(P); 2271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ResultType == T->getResultType() && 2275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) 2276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(), 2279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ParamTypes.size(), T->isVariadic(), 2280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getTypeQuals()); 2281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const FunctionNoProtoType *T) { 2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 2287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) { 2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Typedef == T->getDecl()) 2299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypedefType(Typedef); 2302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfExprType( 2306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TypeOfExprType *T) { 2307670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2308670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2309670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.get() == T->getUnderlyingExpr()) { 2316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.take(); 2317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypeOfExprType(move(E)); 2321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) { 2325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Underlying.isNull()) 2327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Underlying == T->getUnderlyingType()) 2331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypeOfType(Underlying); 2334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) { 2338670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2339670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2340670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.get() == T->getUnderlyingExpr()) { 2347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.take(); 2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildDecltypeType(move(E)); 2352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) { 2356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Record == T->getDecl()) 2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildRecordType(Record); 2366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) { 2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Enum == T->getDecl()) 2377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildEnumType(Enum); 2380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23817da2431c23ef1ee8acb114e39692246e1801afc2John McCall 23827da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 23837da2431c23ef1ee8acb114e39692246e1801afc2John McCallQualType TreeTransform<Derived>::TransformElaboratedType( 23847da2431c23ef1ee8acb114e39692246e1801afc2John McCall const ElaboratedType *T) { 23857da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 23867da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 23877da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 23887da2431c23ef1ee8acb114e39692246e1801afc2John McCall 23897da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (!getDerived().AlwaysRebuild() && 23907da2431c23ef1ee8acb114e39692246e1801afc2John McCall Underlying == T->getUnderlyingType()) 23917da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(T, 0); 23927da2431c23ef1ee8acb114e39692246e1801afc2John McCall 23937da2431c23ef1ee8acb114e39692246e1801afc2John McCall return getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 23947da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 23957da2431c23ef1ee8acb114e39692246e1801afc2John McCall 2396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateTypeParmType *T) { 2400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // Nothing to do 2401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateSpecializationType *T) { 2407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateName Template 2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformTemplateName(T->getTemplateName()); 2409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs; 2413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.reserve(T->getNumArgs()); 2414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end(); 2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Arg != ArgEnd; ++Arg) { 2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg); 2417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewArg.isNull()) 2418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.push_back(NewArg); 2421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: early abort if all of the template arguments and such are the 2424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // same. 2425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: We're missing the locations of the template name, '<', and '>'. 2427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTemplateSpecializationType(Template, 2428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.data(), 2429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.size()); 2430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformQualifiedNameType( 2434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const QualifiedNameType *T) { 2435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Named == T->getNamedType()) 2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildQualifiedNameType(NNS, Named); 2451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) { 2455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 24574a959d8788179d654df6b213b08d2b064989211dDouglas Gregor SourceRange(/*FIXME:*/getDerived().getBaseLocation())); 2458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 2462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType NewTemplateId 2463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypenameType(NNS, NewTemplateId); 2473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypenameType(NNS, T->getIdentifier()); 2476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCInterfaceType( 2480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const ObjCInterfaceType *T) { 2481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 2482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCObjectPointerType( 2487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const ObjCObjectPointerType *T) { 2488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 2489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 249343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 249443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 249543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 249643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 249743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 249843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 249943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 250043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 250143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 250243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 250343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 250443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 250543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 250643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 250743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 250843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 250943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 251043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 251143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 251243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 251343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 251443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 251543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 251643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 251743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 251843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 251943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 252043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 252143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 252243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 252343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 252443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 252543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 252643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 252743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 252843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 252943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 253043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 253143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 253243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 253343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 253443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 253543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 253643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // The case value expressions are not potentially evaluated. 253743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 253843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 253943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the left-hand case value. 254043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult LHS = getDerived().TransformExpr(S->getLHS()); 254143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (LHS.isInvalid()) 254243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 254343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 254443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the right-hand case value (for the GNU case-range extension). 254543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult RHS = getDerived().TransformExpr(S->getRHS()); 254643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (RHS.isInvalid()) 254743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 254843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 254943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 255043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 255143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 255243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 255343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 255443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 255543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 255643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 255743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 255843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 255943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 256043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 256143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 256243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 256343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 256443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 256543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 256643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 256743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 256843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 256943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 257043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 257143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 257243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 257343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 257443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 257543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 257643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 257743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 257843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 257943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 258043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 258143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 258243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 258343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 258443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 258543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 258643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 258743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 258843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 258943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 259043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 259143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 259243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 259343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 259443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 259543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 259643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 259743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 259843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 259943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 260043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 260143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 260243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 260343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 260443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 260543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 260643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 260743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 260843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 260943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 261043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 261143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 261243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 261343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 261443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 261543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 261643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 261743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 261843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 261943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 262043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 262143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then), 262243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getElseLoc(), move(Else)); 262343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 262443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 262543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 262643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 262743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 262843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 262943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 263043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 263143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 263243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 263343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 263443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond)); 263543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 263643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 263743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 263843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 263943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 264043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 264143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 264243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 264343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 264443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 264543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 264643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 264743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 264843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 264943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 265043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 265143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 265243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 265343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 265443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 265543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 265643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 265743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 265843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 265943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 266043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 266143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 266243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 266343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 266443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 266543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 266643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 266743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 266843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body)); 266943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 267043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 267143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 267243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 267343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 267443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 267543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 267643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 267743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 267843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 267943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 268043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 268143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 268243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 268343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 268443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 268543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 268643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 268743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 268843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 268943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 269043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 269143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 269243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 269343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 269443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 269543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 269643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 269743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 269843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 269943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 270043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 270143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 270243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 270343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 270443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 270543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 270643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 270743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 270843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 270943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 271043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 271143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 271243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 271343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 271443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 271543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 271643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 271743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 271843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 271943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 272043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 272143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 272243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 272343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 272443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 272543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Init), move(Cond), move(Inc), 272643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 272743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 272843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 272943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 273043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 273143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 273243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 273343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 273443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 273543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 273643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 273743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 273843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 273943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 274043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 274143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 274243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 274343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 274443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 274543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 274643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 274743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 274843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 274943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 275043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 275143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 275243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 275343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 275443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 275543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 275643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 275743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 275843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 275943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 276043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 276143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 276243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 276343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 276443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 276543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 276643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 276743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 276843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 276943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 277043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 277143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: We always rebuild the return statement because there is no way 277243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 277343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 277443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 277543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 277643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 277743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 277843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 277943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 278043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 278143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 278243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 278343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 278443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 278543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 278643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 278743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 278843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 278943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 279043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 279143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 279243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 279343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 279443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 279543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 279643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 279743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 279843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 279943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 280043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 280143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 280243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 280343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 280443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 280543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 280643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 280743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 280843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 280943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 281043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 281143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 281243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 281343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 281443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 281543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 281643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 281743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 281843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 281943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 282043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 282143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 282243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 282343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 282443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 282543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 282643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 282743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 282843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 282943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 283043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 283143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 283243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 283343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 283443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 283543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 283643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 283743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 283843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 283943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 284043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 284143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 284243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 284343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 284443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 284543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 284643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 284743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 284843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 284943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 285043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 285143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ObjCAtSynchronizedStmt *S) { 285243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 285343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 285443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 285543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 285643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 285743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 285843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 285943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 286043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ObjCForCollectionStmt *S) { 286143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 286243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 286343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 286443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 286543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 286643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 286743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 286843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 286943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 287043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 287143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 287243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 287343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 287443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 287543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 287643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 287743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 287843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 287943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 288043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 288143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 288243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 288343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclaratorInfo(), 288443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 288543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 288643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 288743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 288843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 288943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 289043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 289143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 289243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 289343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 289443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 289543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 289643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 289743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 289843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 289943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 290043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 290143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 290243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 290343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 290443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 290543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 290643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 290743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 290843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 290943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 291043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 291143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 291243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 291343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 291443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 291543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 291643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 291743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TryBlock 291843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 291943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 292043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 292143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 292243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 292343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 292443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 292543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 292643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler 292743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 292843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 292943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 293043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 293143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 293243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 293343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 293443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 293543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 293643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 293743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 293843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 293943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 294043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 294143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Handlers)); 294243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 294343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 294443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 2945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 2946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2947577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 2950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 2956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *ND 2957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 2958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 2959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && ND == E->getDecl()) 2962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDeclRefExpr(ND, E->getLocation()); 2965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 2970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 2976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 2982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 2988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 2994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 3000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 3005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 3014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 3019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 3029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 3030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getArgumentType()); 3031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && T == E->getArgumentType()) 3035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(), 3038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 3043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 3048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 3065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 3088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 3105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 3116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 3117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 3127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 313183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 313283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 313383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier 313483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 313583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange()); 3136c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 313783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 313883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 313983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 3140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *Member 3141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 314783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 3148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Member == E->getMemberDecl()) 3149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 315783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 315883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 3160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Member); 3161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCastExpr(CastExpr *E) { 3166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 3167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 3173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CompoundAssignOperator *E) { 3194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformBinaryOperator(E); 3195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 3200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildConditionalOperator(move(Cond), 321947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 3220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), 322147e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 3228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 3242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 3243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isLvalueCast()); 3244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) { 3249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 3250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 3256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeStartLoc 3260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 3262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getTypeAsWritten()); 3264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 3274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 3278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 3285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeTypeLoc 3289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 3291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 3304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 3314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 3320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 3323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 3333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 3334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 3346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBraceLoc()); 3350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 3355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 3356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 335743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getArray(Index.get(), 3381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 3382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 3389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Start 3390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 3402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 3405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 3413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 3417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 3418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 3423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitValueInitExpr *E) { 3424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 3430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 3433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 3438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 3439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 3444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 3459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 3465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 3469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 3473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 3477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 3478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 3482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 3490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 3491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 3495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult SubStmt 3496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 3498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 3502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildStmtExpr(E->getLParenLoc(), 3505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 3506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 3513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 3516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 3519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 3522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 3529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 3532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 3538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 3557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 3564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 3579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 3581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 3582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 3589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Callee), 3594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCallExpr(E); 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeStartLoc 3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLAngleLoc 3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getStmtClass(), 3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 3643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXReinterpretCastExpr *E) { 3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXFunctionalCastExpr *E) { 3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 3679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 3680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 3689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 3693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 3694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 3697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 3713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, 3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 3738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXNullPtrLiteralExpr *E) { 3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParmVarDecl *Param 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(Param); 3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) { 3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var 382243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl())); 3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Var) 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var == E->getVarDecl()) 3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(), 3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getStartLoc(), 3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var); 3833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 3859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 386143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 3862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 3875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 3888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.get() == E->getArgument()) 3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3912a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 3913a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXPseudoDestructorExpr *E) { 3914a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3915a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 3916a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 3917a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 3918a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 3919a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3920a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 3921a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 3922a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 3923a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 3924a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 3925a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 3926a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 3927a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 3928a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 3929a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 3930a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 3931a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 3932a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 3933a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 3934a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 3935a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 3936a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 3937a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 3938a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 3939a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 3940a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 3941a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 3942a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 3943a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 3944a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 3945a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 3946a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 3947a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 3948a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr( 3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnresolvedFunctionNameExpr *E) { 3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // There is no transformation we can apply to an unresolved function name. 3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 3969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) { 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange()); 3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *ND 3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND == E->getDecl()) 3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildQualifiedDeclRefExpr(NNS, 3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND, 4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr( 4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnresolvedDeclRefExpr *E) { 4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange()); 4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 401581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName Name 401681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 401781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 401881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name == E->getDeclName()) 4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnresolvedDeclRefExpr(NNS, 4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) { 4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateName Template 4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateName(E->getTemplateName()); 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Template.isNull()) 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransArgs; 4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgument TransArg 4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isNull()) 4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.push_back(TransArg); 4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Would like to avoid rebuilding if nothing changed, but we can't 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // compare template arguments (yet). 4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: It's possible that we'll find out now that the template name 4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // actually refers to a type, in which case the caller is actually dealing 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // with a functional cast. Give a reasonable error message! 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(), 4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLAngleLoc(), 4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.data(), 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.size(), 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRAngleLoc()); 4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// The transformation of a temporary-binding expression always attempts to 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// bind a new temporary variable to its subexpression, even if the 4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself 4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique. 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ expression that contains temporaries that should 4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// The transformation of a full expression always attempts to build a new 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// CXXExprWithTemporaries expression, even if the 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression. 4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXExprWithTemporaries *E) { 4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned( 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->shouldDestroyTemporaries())); 4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXTemporaryObjectExpr *E) { 4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 4176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CommaLoc 4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXUnresolvedConstructExpr *E) { 4191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4225bd4c4aebe6035e7a7125470cc9f0f92511230ee3Douglas Gregor 4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr( 4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXUnresolvedMemberExpr *E) { 4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4235a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Sema::TypeTy *ObjectType = 0; 4236a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4237a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getOperatorLoc(), 4238a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4239a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType); 4240a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (Base.isInvalid()) 4241a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4242a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 42433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: The first qualifier found might be a template type parameter, 42443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // in which case there is no transformed declaration to refer to (it might 42453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // refer to a built-in type!). 4246c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 4247c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor = cast_or_null<NamedDecl>( 4248c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor getDerived().TransformDecl(E->getFirstQualifierFoundInScope())); 4249c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor 4250a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4251a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4252a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4253a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4254c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType::getFromOpaquePtr(ObjectType), 4255c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 4256a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4257a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4258a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 4259a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 426081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName Name 426181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc()); 426281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 426381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 426481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 42653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!E->hasExplicitTemplateArgumentList()) { 42663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 42673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 42683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 42693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Base.get() == E->getBase() && 42703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 42713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 42723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 42733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.Owned(E->Retain()); 42743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 42753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 42763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 42773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 42783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 42793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 42803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 42813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 42823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope); 42833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 42843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 42853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This is an ugly hack, which forces the same template name to 42863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // be looked up multiple times. Yuck! 42873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This also won't work for, e.g., x->template operator+<int> 42883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName OrigTemplateName 42893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo()); 42903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 42913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName Template 42923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = getDerived().TransformTemplateName(OrigTemplateName, 42933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 42943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (Template.isNull()) 42953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 42963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 42973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransArgs; 42983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 42993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateArgument TransArg 43003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 43013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TransArg.isNull()) 43023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 43033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 43043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.push_back(TransArg); 43053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 4306a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4310a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4311a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 43123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Template, 4313c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor E->getMemberLoc(), 43143b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 43153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getLAngleLoc(), 43163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.data(), 43173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.size(), 43183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getRAngleLoc()); 4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 4341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ObjCProtocolDecl *Protocol 4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 439809105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 439909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian ObjCImplicitSetterGetterRefExpr *E) { 4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) { 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.BuildPointerType(PointeeType, 0, 4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) { 4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.BuildBlockPointerType(PointeeType, 0, 4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType 4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) { 4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.BuildReferenceType(ReferentType, true, 0, 4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType 4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) { 4489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildReferenceType(ReferentType, false, 0, 4490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 4496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ClassType) { 4497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 0, 4498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 4504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 4505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 4507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 4508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 4510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 4511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 4512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 4513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Types[] = { 4516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 4517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 4518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 4519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 4520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 4521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 4522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 4523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 4524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 4525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 4526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeType.isNull()) 4529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 4530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 4532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 4533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 4534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 4539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 4540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 4542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 4543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 4544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 4545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 4549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayWithExprType(QualType ElementType, 4550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4551577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 4552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 4553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 4555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 4556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 4557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 4561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayWithoutExprType( 4562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType, 4563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 4565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 4566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 4567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 4568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 4572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 4573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 4575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 4576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 4577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 4581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 4582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 4586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 4587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 4588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 4589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 4593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 4594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 4598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 4599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 4600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 4601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 4605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 4606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 4607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 4608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 4612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 4613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 4614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 4615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 4616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 4617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 4618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 4619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 4620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 4621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 4625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 4628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 4629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 4633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType *ParamTypes, 4634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 4635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, 4636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 4637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 4638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 4639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 4645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 4646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 4650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 4651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 4655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 4656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 4660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateName Template, 4661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateArgument *Args, 4662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumArgs) { 4663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Missing source locations for the template name, <, >. 4664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(), 4665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation(), Args, NumArgs, 4666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation()); 4667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4669dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 4670dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 4671dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4672dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 4673a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 4674c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 4675c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 4676dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 4677dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 4678dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 4679dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 4680dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 4681c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 4682495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 4683c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 4684c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 4685495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor false)); 4686dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 4687dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 4688dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 4689dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 4690dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4691dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 4692dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 4693dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 4694dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 4695dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 4696dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 4697dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 4698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4699dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 4700dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 4701dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 4702dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 4703dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 4704dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here"); 4705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 4706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 4707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 4708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 4709dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 4710dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 4711dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 4712dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 4713d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 4714d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName 4715d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 4716d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 4717d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 4718d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 4719d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 4720d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 4721d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 4722d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 4723d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName 4724d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 4725d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 4726d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl) { 4727d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl); 4728d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 4729d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 4730d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 4731d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName 4732d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 47333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 47343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 4735d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 4736d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 47373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 47383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 47393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 47403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor II, 47413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 47423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 47433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor ObjectType.getAsOpaquePtr()) 47443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 4745d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 4756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SecondExpr == 0 || isPostIncDec) { 4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 4762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc 4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 4767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType() && 4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Compute the transformed set of functions (and function templates) to be 4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47898f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor DeclRefExpr *DRE 47908f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts()); 4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we have to check 4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // IsAcceptableNonMemberOperatorCandidate for each of these? 47948f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F) 4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Functions.insert(*F); 4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OpName 4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions); 4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc 4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = 4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 4824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 4825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 4827